SpringSecurity(1-5)SpringSecurity注解
Spring Security 注解
1. 注解
Spring Security 默认是禁⽤注解的!(讨厌... )
要想开启注解功能需要在配置类上加⼊ @EnableMethodSecurity 注解来判断⽤户对某个控制层的⽅法是否具有访问权限。
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
...
}
Copied!
Spring Security ⽀持三套注解:
#注解
jsr250 注解@DenyAll、@PermitAll、@RolesAllowed
secured 注解@Secured
prePost 注解@PreAuthorize、@PostAuthorize
2. JSR-250 注解
@RolesAllowed("USER") // 这⾥可以省略前缀 ROLE_,但是数据库中的⾓⾊信息必须以 ROLE_ 开头
@GetMapping("/user-can-do")
public String user() {
return "user can do";
}
@RolesAllowed({"USER", "ADMIN"})
@GetMapping("/admin-can-do")
public String admin() {
return "admin can do";
}
Copied!
@DenyAll、@PermitAll、@RolesAllowed 三个注解的功能显⽽易见。
不过有⼀个容易误解的地⽅: .permitAll()和.anonymous()的区别:
Spring Security 为了统⼀,给 “未登录” 的⽤户赋予了⼀个⾓⾊:匿名⽤户。
配置类中的配置.antMatchers("/anonCanDo").anonymous()表⽰匿名⽤户可访问,⾃然也就是⽤户不需要登录认证即可访问该 URI 。
spring是什么意思1注意
⼀旦⽤户经过登陆后,其⾝份⽆论在是什么,他都不再是匿名⽤户了,即,它失去了匿名⽤户这个⾝份。此时,如果他再去访问匿名⽤户可登陆的 URI 反⽽是显⽰没有权限!
不过,这⾥不⽤太⼤惊⼩怪,因为 Shiro 也是这样。
.antMatchers("/", "/users").permitAll()就没有这个问题。它是指⽆论是否登陆,登陆后⽆论是什么⾝份都能访问。所以,你⼼⾥想要表达的『匿名⽤户也可以访问』⼤概率是指.permitAll(),⽽⾮.anonymous()。
3. Secured 注解
@Secured 注解是 jsr250 标准出现之前,Spring Security 框架⾃⼰定义的注解。
@Secured 标注于⽅法上,表⽰只有具有它所指定的⾓⾊的⽤户才可以调⽤该⽅法。如果当前⽤户不具备所要求的⾓⾊,那么,将会抛
出 AccessDenied 异常。
// @Secured("IS_AUTHENTICATED_ANONYMOUSLY")
// @Secured("ADMIN")
@Secured({"USER", "ADMIN"}) // 这⾥可以省略前缀 ROLE_
@RequestMapping("/admin")
public String admin() {
return "admin";
}
Copied!
4. PrePost 注解
PrePost 注解也是 jsr250 标准出现之前,Spring Security 框架⾃⼰定义的注解。
PrePost 注解的功能⽐ Secured 注解的功能更强⼤,它可以通过使⽤ Spring EL 来表达具有逻辑判断的校验规则。
@PreAuthorize 注解:适合进⼊⽅法前的权限验证;
@PostAuthorize 注解:使⽤并不多,在⽅法执⾏后再进⾏权限验证。
@PreAuthorize("hasRole('ADMIN')") // 等同于前⾯章节的配置中的 hasRole("...")
@RequestMapping("/admin")
public String admin() {
return "admin";
}
Copied!
这样只要拥有 ADMIN ⾓⾊的⽤户才可以访问此⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论