spring security3.x学习(21)_关于方法过滤

@RolesAllowed("ROLE_USER")
public void changePassword(String username, String password); 
@RolesAllowed({"ROLE_USER","ROLE_ADMIN"})
public void changePassword(String username, String password);
 
"正如我们可能推断出的那样,@RolesAllowed注解并不支持SpEL 表达式。"

JSR-250还有两个其它的注解:@PermitAll 和@DenyAll。它们的功能正如你所预想的,允许和禁止对方法的任何请求。

在看一下@Secured注解实现方法安全:
<global-method-security secured-annotations="enabled"/>
因为@Secured与JSR标准的@RolesAllowed注解在功能上一致,所以并没有充分的理由在新代码中使用它,但是它能够在Spring的遗留代码中运行
” 

还有一种,AOP技术:
  实现方法安全的最后一项技术也可能是最强大的方法,它还有一个好处是不需要修改源代码。作为替代,它使用面向方面的编程方式为一个方法或方法集合声明切点(pointcut),而增强(advice)会在切点匹配的情况下进行基于角色的安全检查。AOP的声明只在Spring Security的XML配置文件中并不涉及任何的注解。 
<global-method-security>
  <protect-pointcut access="ROLE_ADMIN"  expression="execution(* com.packtpub.springsecurity.service.IUserService.*(..))"/> 
   <protect-pointcut access="ROLE_ADMIN" expression="execution(* com.packtpub.springsecurity.service.I*Service.*(..))"/>
</global-method-security> 

比较方法授权的类型:

以下这段话值得注意:
强烈建议在接口上声明AOP规则(以及其它的安全注解),而不是在实现类上。使用类(通过Spring的CGLIB代理)进行声明可能会导致应用出现不可预知的行为改变,通常在正确性方面比不上在接口定义安全声明(通过AOP)。

spring security还提供了一种方式:
xmlns:security="http://www.springframework.org/schema/security"(声明)

<bean id="userService" class="com.packtpub.springsecurity.service.UserServiceImpl">
  <security:intercept-methods>
    <security:protect access="ROLE_USER" method="changePassword"/>
  </security:intercept-methods>
</bean>
这种方式可以在配置文件上直接指定哪个方法需要哪个属性,不过书中这样描述它:
尽管阅读起来很容易,但是这种方式的方法安全声明在表现性上不如切点,在功能上不如我们已经见过的注解方式。但是,对于一定类型的工程,使用XML声明的方式足以满足你的需求。
” 
可以使用简单的通配符来注明方法名,如,我们可以用如下的方式保护给定bean里所有的set方法:
<security:intercept-methods>
  <security:protect access="ROLE_USER" method="set*"/>
</security:intercept-methods>
方法名匹配可以包含前面或后面的正则表达式匹配符(*)。这个符号的存在意味着要对方法名进行通配符匹配,为所有匹配该正则表达式的方法添加拦截器。注意,其它常用的正则表达式操作符(如?或[)并不支持。请查阅相关的Java 文档以理解基本的正则表达式。更复杂的通配符匹配或正则匹配并不支持。
” 
@PreAuthorize("#username == principal.username and hasRole('ROLE_USER')")
public void changePassword(String username, String password);
“Spring Security方法注解所绑定的SpEL支持更复杂的表达式,包括含有方法参数的表达式。”
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用中提到,在6.0版本中,Spring Security的授权是通过过滤器来实现的,具体来说是通过AuthorizationFilter来负责授权。而在之前的版本中,使用的是FilterSecurityInterceptor,但已经被标记为过时的。引用中提到,当出现AccessDeniedException异常时,会被ExceptionTranslationFilter捕获和处理。在处理这个异常时,首先会获取认证对象Authentication,然后判断是否是匿名用户或者是通过记住我功能进行的认证。如果是匿名用户或者记住我功能,会发送开始认证的请求;如果不是,会使用访问拒绝处理器进行处理。引用是一本实战教程,介绍了Spring Security 6.x版本的使用方法,可以用于生产项目工程,其中包括了本地账号、手机号、邮箱多账号登录和账号与用户信息分离表结构设计等内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Spring Security 6.x 系列【17】源码篇之基于请求URL的访问控制流程分析](https://blog.csdn.net/qq_43437874/article/details/130031402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [springsecurity6.x实战学习笔记,可完美的移植到生产环境](https://download.csdn.net/download/weixin_44020302/87623408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值