Spring Security(三)保护方法应用

使用@Secured注解限制方法调用

SecurityWebInitializer.java

public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer{}

MethodSecureConfig.java

@Configuration
@EnableGlobalMethodSecurity(securedEnabled=true)  //这个注解需要一个AuthenticationManager,
public class MethodSecureConfig extends GlobalMethodSecurityConfiguration {
    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("yiibai").password("123456").roles("USER");
        auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");  
    }   
}

SecurityConfig.java

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}
@Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class,MethodSecureConfig.class,SecurityConfig.class};  
    }

测试

@Secured("ROLE_USER")   
@RequestMapping("/test")
public String test()
{
    System.out.println("TEST SECURTE");
    return null;
}

这里写图片描述
GlobalMethodSecurityConfiguration 与WebSecurityConfigurerAdapter类似,这个类能为方法级别的安全性提供更精细的配置。
@EnableGlobalMethodSecurity注解,如果它的securedEnabled属性的值为true的话,将会创建一个切点,这样的话Spring Security切面就会包装带有@Secured注解的方法。

使用JSR-250的@RolesAllowed注解

JSR——–Java Specification Requests ———–Java规范要求(Java的功能和版本在不断的更新,JSR就是用来规范这些功能和接口的)
@Secured注解是Spring特有的注解。如果更倾向于使用Java标准定义的注解,你可以考虑使用@RolesAllowed。@Secured和@RolesAllowed在各方面基本上是一致的。
MethodSecureConfig.java

@EnableGlobalMethodSecurity(securedEnabled=true,jsr250Enabled=true)
@RolesAllowed("ROLE_USER")
@RequestMapping("/test")
public String test()
{
    System.out.println("TEST @RolesAllowed注解");
    return null;
}

securedEnabled与jsr250Enabled并不冲突。这两种注解风格可以同时使用。

使用表达式实现方法级别的安全性

尽管@Secured和@RolesAllowed在拒绝未认证用户方面表现不错,但这也是它们所能做到的所有事情了。
Spring Security3.0引入了几个新注解,这些注解都可以接受一个SpEL表达式。表达式可以是任意合法的SpEL表达式。如果表达式的计算结果为true,那么安全规则通过,否则就会失败。
这里写图片描述

方法调用前验证

MethodSecureConfig.java

@EnableGlobalMethodSecurity(securedEnabled=true,jsr250Enabled=true,prePostEnabled=true)
@PreAuthorize("hasRole('ROLE_USER')")
@RequestMapping("/test")
public String test()
{
    System.out.println("TEST @PreAuthorize注解");
    return null;
}

@PreAuthorize和@PostAuthorize,它们能够基于表达式的计算结果来限制方法的访问。表达式带来了极大的灵活性。通过使用表达式,就可以定义任意允许访问或不允许访问方法的条件。

@PreAuthorize("hasRole('ROLE_USER') and  #admin.adminId==3 or hasRole('ROLE_ADMIN')")
public void addAdmin(Admin admin)
{
    System.out.println("TEST @PreAuthorize注解");
    ....
}

例如上面SpEL表达式定义了权限为USER或ADMIN,并且#admin直接引用了方法中同名的参数。这使得Spring Security能够检查传入方法的参数。(这里为传入的admin参数的adminId属性值为3)

方法调用后验证

方法调用后验证权限并不是常见的方式。这种情况意味着方法必须被调用执行并且得到了返回值。

过滤方法的输入和输出

事后对方法的返回值进行过滤
@PostFilter也使用一个SpEL作为值参数。@PostFilter会使用这个表达式计算该方法所返回集合的每个成员,将计算结果为false的成员移除掉。

 @PostFilter("filterObject.type=='user'")  //会把返回的 List<Admin>集合中type!=user的Admin过滤掉
 public List<Admin> admins getAdmins() {
        ...
    }

filterObject对象引用的是这个方法所返回List中的某一个元素(这里就是Admin)。
事先对方法参数进行过滤

 @PreFilter("targetObject.type==user") //传递的admins集合参数中type!=user的Admin过滤掉
 public void delAdmins( List<Admin>  admins) {
        ...
    }

targetObject代表了要进行计算的当前列表元素。

以上只是学习所做的笔记,如有错误请指出。谢谢啦!!!

猜你喜欢

转载自blog.csdn.net/z1790424577/article/details/80977960