网站网站建设公,建设局网站买卖合同,杭州定制软件开发,百度网站大全旧版一、SPEL表达式权限控制从spring security 3.0开始已经可以使用spring Expression表达式来控制授权#xff0c;允许在表达式中使用复杂的布尔逻辑来控制访问的权限。Spring Security可用表达式对象的基类是SecurityExpressionRoot。表达式函数描述hasRole([role])用户拥有指定…一、SPEL表达式权限控制从spring security 3.0开始已经可以使用spring Expression表达式来控制授权允许在表达式中使用复杂的布尔逻辑来控制访问的权限。Spring Security可用表达式对象的基类是SecurityExpressionRoot。表达式函数描述hasRole([role])用户拥有指定的角色时返回true (Spring security默认会带有ROLE_前缀),去除前缀参考Remove the ROLE_hasAnyRole([role1,role2])用户拥有任意一个指定的角色时返回truehasAuthority([authority])拥有某资源的访问权限时返回truehasAnyAuthority([auth1,auth2])拥有某些资源其中部分资源的访问权限时返回truepermitAll永远返回truedenyAll永远返回falseanonymous当前用户是anonymous时返回truerememberMe当前用户是rememberMe用户返回trueauthentication当前登录用户的authentication对象fullAuthenticated当前用户既不是anonymous也不是rememberMe用户时返回truehasIpAddress(192.168.1.0/24))请求发送的IP匹配时返回true部分朋友可能会对Authority和Role有些混淆。Authority作为资源访问权限可大可小可以是某按钮的访问权限(如资源IDbiz1)也可以是某类用户角色的访问权限(如资源IDADMIN)。当Authority作为角色资源权限时hasAuthority(ROLE_ADMIN)与hasRole(ADMIN)是一样的效果。二、SPEL在全局配置中的使用我们可以通过继承WebSecurityConfigurerAdapter实现相关的配置方法进行全局的安全配置(之前的章节已经讲过) 。下面就为大家介绍一些如何在全局配置中使用SPEL表达式。2.1.URL安全表达式config.antMatchers(/system/*).access(hasAuthority(ADMIN) or hasAuthority(USER)).anyRequest().authenticated();这里我们定义了应用/person/*URL的范围只有拥有ADMIN或者USER权限的用户才能访问这些person资源。2.2.安全表达式中引用bean这种方式比较适合有复杂权限验证逻辑的情况当Spring Security提供的默认表达式方法无法满足我们的需求的时候。首先我们定义一个权限验证的RbacService。Component(rbacService)Slf4jpublic class RbacService {//返回true表示验证通过public boolean hasPermission(HttpServletRequest request, Authentication authentication) {//验证逻辑代码return true;}public boolean checkUserId(Authentication authentication, int id) {//验证逻辑代码return true;}}对于/person/{id}对应的资源的访问调用rbacService的bean的方法checkUserId进行权限验证传递参数为authentication对象和person的id。该id为PathVariable以#开头表示。config.antMatchers(/person/{id}).access(rbacService.checkUserId(authentication,#id)).anyRequest().access(rbacService.hasPermission(request,authentication));三、 Method表达式安全控制如果我们想实现方法级别的安全配置Spring Security提供了四种注解分别是PreAuthorize , PreFilter , PostAuthorize 和 PostFilter3.1.开启方法级别注解的配置在Spring安全配置代码中加上EnableGlobalMethodSecurity注解开启方法级别安全配置功能。ConfigurationEnableGlobalMethodSecurity(prePostEnabled true)public class MySecurityConfig extends WebSecurityConfigurerAdapter {3.2 使用PreAuthorize注解PreAuthorize 注解适合进入方法前的权限验证。只有拥有ADMIN角色才能访问findAll方法。PreAuthorize(hasRole(ADMIN))List findAll();3.3 使用PostAuthorize注解PostAuthorize 在方法执行后再进行权限验证,适合根据返回值结果进行权限验证。Spring EL 提供返回对象能够在表达式语言中获取返回的对象returnObject。下文代码只有返回值的name等于authentication对象的name才能正确返回否则抛出异常。PostAuthorize(returnObject.name authentication.name)Person findOne(Integer id);3.4 使用PreFilter注解PreFilter 针对参数进行过滤,下文代码表示针对ids参数进行过滤只有id为偶数才能访问delete方法。//当有多个对象是使用filterTarget进行标注PreFilter(filterTargetids, valuefilterObject%20)public void delete(List ids, List usernames) {3.5 使用PostFilter 注解PostFilter 针对返回结果进行过滤特别适用于集合类返回值过滤集合中不符合表达式的对象。PostFilter(filterObject.name authentication.name)List findAll();总结以上所述是小编给大家介绍的使用Spring安全表达式控制系统功能访问权限问题希望对大家有所帮助如果大家有任何疑问请给我留言小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持如果你觉得本文对你有帮助欢迎转载烦请注明出处谢谢