shiro基于注解的授权

jopen 10年前

基于注解的授权

如果你更喜欢基于注解的授权控制,除了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

...

}