Spring Security使用授权标签和注解
2015-12-03 13:11
477 查看
Spring Security的声明式安全授权有两种方式,一种是以url模式匹配的方式,另一种是方法上使用注解声明权限,这里重点说第二种。
Spring Security默认是禁用注解的,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,并在该类中将AuthenticationManager定义为Bean。
@Configuration
@EnableWebSecurity
/**
* 三种方法级权限控制
* @author luenxin
* 1.securedEnabled: Spring Security’s native annotation
* 2.jsr250Enabled: standards-based and allow simple role-based constraints
* 3.prePostEnabled: expression-based
*/
@EnableGlobalMethodSecurity(jsr250Enabled=true)
public class CasSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
AuthenticationManager authenticationManager;
}这样就启动了JSR-250的注解支持,我们在方法上使用注解来控制访问权限。
一、JSR-250注解
@DenyAll 拒绝所有访问
@RolesAllowed({"USER", "ADMIN"}) 该方法只要具有"USER", "ADMIN"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN
@PermitAll 允许所有访问
三种注解在代码的注释里已经说明了,上边说的是JSR-250注解,还有一种更强大的是prePostEnabled注解,这是一种基于表达式的注解,并可以自定义扩展,只需继承GlobalMethodSecurityConfiguration类就可以实现。当然,别忘了在该扩展类上添加注解:@EnableGlobalMethodSecurity(prePostEnabled = true)来启动这种注解支持。如果没有访问方法的权限,会抛出AccessDeniedException。
二、prePostEnabled注解
1、@PreAuthorize:在方法执行之前执行,而且这里可以调用方法的参数,也可以得到参数值,这是利用JAVA8的参数名反射特性,如果没用JAVA8,那么也可以利用Spring Security的@P标注参数,或者Spring Data的@Param标注参数。
@PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
void changePassword(@P("userId") long userId ){ }
这里表示在changePassword方法执行之前,判断方法参数userId的值是否等于principal中保存的当前用户的userId,或者当前用户是否具有ROLE_ADMIN权限,两种符合其一,就可以访问该方法。
2、@PostAuthorize:在方法执行之后执行,而且这里可以调用方法的返回值,如果EL为false,那么该方法也已经执行完了,可能会回滚。EL变量returnObject表示返回的对象。
@PostAuthorize
User getUser("returnObject.userId == authentication.principal.userId or hasPermission(returnObject, 'ADMIN')");
3、@PostFilter:在方法执行之后执行,而且这里可以调用方法的返回值,然后对返回值进行过滤或处理或修改并返回。EL变量returnObject表示返回的对象。只有方法返回的是集合或数组类型的才可以使用。(与分页技术不兼容)
@postFilter
User getUser("hasPermission(returnObject, 'ADMIN')");
4、@PreFilter:在方法执行之前执行,而且这里可以调用方法的参数,然后对参数值进行过滤或处理或修改,EL变量filterObject表示参数,如有多个参数,使用filterTarget注解参数。只有方法参数是集合或数组才行。(很少会用到,与分页技术不兼容)
Spring Security默认是禁用注解的,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,并在该类中将AuthenticationManager定义为Bean。
@Configuration
@EnableWebSecurity
/**
* 三种方法级权限控制
* @author luenxin
* 1.securedEnabled: Spring Security’s native annotation
* 2.jsr250Enabled: standards-based and allow simple role-based constraints
* 3.prePostEnabled: expression-based
*/
@EnableGlobalMethodSecurity(jsr250Enabled=true)
public class CasSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
AuthenticationManager authenticationManager;
}这样就启动了JSR-250的注解支持,我们在方法上使用注解来控制访问权限。
一、JSR-250注解
@DenyAll 拒绝所有访问
@RolesAllowed({"USER", "ADMIN"}) 该方法只要具有"USER", "ADMIN"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN
@PermitAll 允许所有访问
三种注解在代码的注释里已经说明了,上边说的是JSR-250注解,还有一种更强大的是prePostEnabled注解,这是一种基于表达式的注解,并可以自定义扩展,只需继承GlobalMethodSecurityConfiguration类就可以实现。当然,别忘了在该扩展类上添加注解:@EnableGlobalMethodSecurity(prePostEnabled = true)来启动这种注解支持。如果没有访问方法的权限,会抛出AccessDeniedException。
二、prePostEnabled注解
1、@PreAuthorize:在方法执行之前执行,而且这里可以调用方法的参数,也可以得到参数值,这是利用JAVA8的参数名反射特性,如果没用JAVA8,那么也可以利用Spring Security的@P标注参数,或者Spring Data的@Param标注参数。
@PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
void changePassword(@P("userId") long userId ){ }
这里表示在changePassword方法执行之前,判断方法参数userId的值是否等于principal中保存的当前用户的userId,或者当前用户是否具有ROLE_ADMIN权限,两种符合其一,就可以访问该方法。
2、@PostAuthorize:在方法执行之后执行,而且这里可以调用方法的返回值,如果EL为false,那么该方法也已经执行完了,可能会回滚。EL变量returnObject表示返回的对象。
@PostAuthorize
User getUser("returnObject.userId == authentication.principal.userId or hasPermission(returnObject, 'ADMIN')");
3、@PostFilter:在方法执行之后执行,而且这里可以调用方法的返回值,然后对返回值进行过滤或处理或修改并返回。EL变量returnObject表示返回的对象。只有方法返回的是集合或数组类型的才可以使用。(与分页技术不兼容)
@postFilter
User getUser("hasPermission(returnObject, 'ADMIN')");
4、@PreFilter:在方法执行之前执行,而且这里可以调用方法的参数,然后对参数值进行过滤或处理或修改,EL变量filterObject表示参数,如有多个参数,使用filterTarget注解参数。只有方法参数是集合或数组才行。(很少会用到,与分页技术不兼容)
相关文章推荐
- Oracle新建用户、角色,授权,建表空间的sql语句
- MySql增加用户、授权、修改密码等语句
- 远程连接mysql 授权方法详解
- 在WIN命令提示符下mysql 用户新建、授权、删除,密码修改
- sqlSQL数据库怎么批量为存储过程/函数授权呢?
- asp.net5中用户认证与授权(2)
- asp.net5中的用户认证与授权(1)
- MySQL创建用户与授权及撤销用户权限方法
- 微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
- windows server 2008 远程桌面(授权、普通用户登录)
- ASP.NET身份验证机制membership入门——配置篇(1)
- ASP.NET身份验证机制membership入门——配置篇(2)
- ASP.NET身份验证机制membership入门——控件篇
- ASP.NET身份验证机制membership入门——API篇
- ASP.NET身份验证机制membership入门——项目
- InstallShield单机版授权的注意事项
- 像这样的高额授权费在业界并不常见
- Windows2003终端服务授权激活(破解远程桌面连接数)
- 用本地动态IP连接本地mysql
- RBAC介绍