使用@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代表了要进行计算的当前列表元素。
以上只是学习所做的笔记,如有错误请指出。谢谢啦!!!