《Spring Security》第三章 基于方法级别的安全配置

第三章 基于方法级别的安全配置

Spring Security 提供了两种方法级别的安全配置,一个是框架的原始注释 @secure ,另一个新的基于表达式的注释。

可以针对单个 Bean 进行保护,也可以使用 AspectJ 风格的切入点跨服务层保护多个 Bean。

一、EnableGlobalMethodSecurity 注解

在任何 @Configuration 实例上使用 @EnableGlobalMethodSecurity 注释,启用基于注释的安全性。示例如下:

@EnableGlobalMethodSecurity(securedEnabled = true)
@Configuration
public class MethodSecurityConfig {
    // ...
}

然后向方法添加注释,将相应地限制对该方法的访问。这些信息将会被传递给 AccessDecisionManager:

public interface BankService {
    @Secured("IS_AUTHENTICATED_ANONYMOUSLY")
    public Account readAccount(Long id);

    @Secured("IS_AUTHENTICATED_ANONYMOUSLY")
    public Account[] findAccounts();

    @Secured("ROLE_TELLER")
    public Account post(Account account, double amount);
}

或者使用 基于表达式的语法:

@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class MethodSecurityConfig {
    // ...
}
public interface BankService {
    @PreAuthorize("isAnnoymous()")
    public Account readAccount(Long id);

    @PreAuthorize("isAnnoymous()")
    public Account[] findAccounts();

    @PreAuthorize("hasAuthority('ROLE_TELLER')")
    public Account post(Account account, double amount);
}

二、自定义方法安全配置

如果需要执行比 @EnableGlobalMethodSecurity 注释提供的更复杂的操作,可以扩展 GlobalMethodSecurityConfiguration。

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class methodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler(){
        // create and return custom handler
        return expressionHandler;
    }
}
文章作者: koral
文章链接: http://luokaiii.github.io/2019/07/18/读书笔记/《SpringSecurity》/3.方法级别的安全配置/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自