一.开启方式
在Spring Security中提供了一些访问控制的注解。这些注解都是默认是都不可用的,需要在启动类中添加@EnableGlobalMethodSecurity注解进行开启。 如果不开启就使用注解会报500
二.常用注解
1.@Secured
@Secured是专门用于判断是否具有角色的。能写在方法或类上。@Secured参数要以ROLE_开头。
1.1实现步骤
1)开启注解 在启动类(也可以在配置类等能够扫描的类上)上添加@EnableGlobalMethodSecurity(securedEnabled = true)
代码语言:javascript复制@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MyApp {
public static void main(String [] args){
SpringApplication.run(MyApp.class,args);
}
}
2)在控制器方法上 添加@Secured注解
代码语言:javascript复制@Secured("ROLE_abc")
@RequestMapping("/toMain")
public String toMain(){
return "redirect:/main.html";
}
代码语言:javascript复制 //表示必须同时拥有test和admin角色才可以访问
@Secured("ROLE_test,RLOE_admin")
@RequestMapping("/demo02")
@ResponseBody
public String demo02()
{
return "demo02";
}
3)修改配置类 配置类中方法配置保留最基本的配置即可。
代码语言:javascript复制protected void configure(HttpSecurity http) throws Exception {
// 表单认证
http.formLogin()
.loginProcessingUrl("/login") //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
.successForwardUrl("/main") //此处是post请求
.loginPage("/login.html");
// url 拦截
http.authorizeRequests()
.antMatchers("/login.html","/noauth.html").permitAll() //login.html不需要被认证
.anyRequest().authenticated();//所有的请求都必须被认证。必须登录后才能访问。
//关闭csrf防护
http.csrf().disable();
}
2.@PreAuthorize和@PostAuthorize
@PreAuthorize和@PostAuthorize都是方法或类级别注解。 @PreAuthorize表示访问方法或类在执行之前先判断权限,大多情况下都是使用这个注解,注解的参数和access()方法参数取值相同,都是权限表达式。 @PostAuthorize表示方法或类执行结束后判断权限,此注解很少被使用到。
2.1实现步骤
1)开启注解 在启动类中开启@PreAuthrize注解
代码语言:javascript复制@SpringBootApplication
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MyApp {
public static void main(String [] args){
SpringApplication.run(MyApp.class,args);
}
}
2)添加@PreAuthrize注解 在控制器方法上添加@PreAuthorize,参数可以是任何access()支持的表达式
代码语言:javascript复制@PreAuthorize("hasRole('abc')")
@RequestMapping("/toMain")
public String toMain(){
return "redirect:/main.html";
}