shiro基于注解的授权
基于注解的授权
如果你更喜欢基于注解的授权控制,除了Subject的API之外,Shiro提供了一个Java5的注解集。
配置
在你使用JAVA的注解之前,你需要在程序中启动AOP支持,因为有许多AOP框架,所以很不幸,在这里并没有标准的在程序中启用AOP的方法。
关于AspectJ,你可以查看我们的AspectJ sample application(http://svn.apache.org/repos/asf/shiro/trunk/samples/aspectj/);
关于Spring,你可以查看Spring Integration文档;
关于Guice,你可以查看我们的 Guice Integration文档;
RequiresAuthentication注解
RequiresAuthentication注解要求在访问或调用被注解的类/实例/方法时,Subject在当前的session中已经被验证。
例如:
@RequiresAuthentication
public void updateAccount(Account userAccount) {
//this method will only be invoked by a
//Subject that is guaranteed authenticated
...
}
这基本上与下面的基于对象的逻辑效果相同:
public void updateAccount(Account userAccount) {
if (!SecurityUtils.getSubject().isAuthenticated()) {
throw new AuthorizationException(...);
}
//Subject is guaranteed authenticated here
...
}
RequiresGuest注解
RequiresGuest注解要求当前Subject是一个“访客”,也就是,在访问或调用被注解的类/实例/方法时,他们没有被认证或者在被前一个Session记住。
例如:
@RequiresGuest
public void signUp(User newUser) {
//this method will only be invoked by a
//Subject that is unknown/anonymous
...
}
这基本上与下面的基于对象的逻辑效果相同:
public void signUp(User newUser) {
Subject currentUser = SecurityUtils.getSubject();
PrincipalCollection principals = currentUser.getPrincipals();
if (principals != null && !principals.isEmpty()) {
//known identity - not a guest:
throw new AuthorizationException(...);
}
//Subject is guaranteed to be a 'guest' here
...
}
RequiresPermissions 注解
RequiresPermissions 注解要求当前Subject在执行被注解的方法时具备一个或多个对应的权限。
例如:
@RequiresPermissions("account:create")
public void createAccount(Account account) {
//this method will only be invoked by a Subject
//that is permitted to create an account
...
}
这基本上与下面的基于对象的逻辑效果相同:
public void createAcc
/this method will only be invoked by an administrator
...
}
RequiresRoles 注解
RequiresPermissions 注解要求当前Subject在执行被注解的方法时具备所有的角色,否则将抛出AuthorizationException异常。
例如:
@RequiresRoles("administrator")
public void deleteUser(User user) {
//this method will only be invoked by an administrator
...
}
这基本上与下面的基于对象的逻辑效果相同:
public void deleteUser(User user) {
Subject currentUser = SecurityUtils.getSubject();
if (!subject.hasRole("administrator")) {
throw new AuthorizationException(...);
}
//Subject is guaranteed to be an 'administrator' here
...
}
RequiresUser 注解
RequiresUser*注解要求在访问或调用被注解的类/实例/方法时,当前Subject是一个程序用户,“程序用户”是一个已知身份的Subject,或者在当前Session中被验证过或者在以前的Session中被记住过。
例如:
@RequiresUser
public void updateAccount(Account account) {
//this method will only be invoked by a 'user'
//i.e. a Subject with a known identity
...
}
这基本上与下面的基于对象的逻辑效果相同:
public void updateAccount(Account account) {
Subject currentUser = SecurityUtils.getSubject();
PrincipalCollection principals = currentUser.getPrincipals();
if (principals == null || principals.isEmpty()) {
//no identity - they're anonymous, not allowed:
throw new AuthorizationException(...);
}
//Subject is guaranteed to have a known identity here
...
}