授权控制
授权包括web授权、方法注解授权。
web授权
SpringSecurity通过http.authorizeRequests()对web请求(URL访问)进行授权保护。
一、请求匹配
1、antMatchers("/login","/getver"):匹配到的请求。此时实际*问这些路径的用户为匿名用户anonymousUser,其权限列表为[ROLE_ANONYMOUS]。
antMatchers中可以添加多个字符串,每个字符串支持?(单个字符)、*(0或任意个字符)、**(0或更多的目录)三种通配符,也支持正则表达式。
antMatchers("/js/**","/css/**"):静态资源
antMatchers("/**/*.jpg"):所有JPG图片
2、anyRequest():表示所有请求。
二、匹配请求的处理/控制
常用的包括以下:
1、permitAll():允许匹配到的请求通过
2、denyAll():匹配的请求禁止访问
3、authenticated():匹配到的请求认证后方可访问(必须登录)
4、hasIpAddress():匹配到的请求其IP地址满足条件方可访问
5、hasRole():用户拥有哪些角色才可访问,类似的有hasAnyRole
6、hasAuthority:用户拥有哪些权限才可访问hasAnyAuthority
方法注解授权
在SecurityConfig中通过antMatchers.hasAuthority等方式进行web路径权限控制的方式,也可以直接在方法名上通过注解的形式添加权限控制。
SpringSecurity提供了4种注解分别是@PreAuthorize、@PreFilter、@PostAuthorize、@PostFilter。通常使用@PreAuthorize注解。
通过@EnableGlobalMethodSecurity(prePostEnabled = true)开启。
此时可以把antMatchers.hasAuthority或antMatchers.hasRole注释掉。但是对antMatchers.permitAll()允许全部访问不可注释。
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//拦截并认证所有的请求
http.authorizeRequests()
//对于登录接口或登录页面不拦截
.antMatchers("/login","/getver","/other").permitAll()
//所有的请求必须经过认证(包括登录),除非加入上面的不拦截
.anyRequest().authenticated()
//再返回一个HttpSecurity http设置退出登录,退出登录默认地址为/logout
.and().logout().permitAll()
//添加退出操作和退出成功操作
.addLogoutHandler(myLogoutHandler).logoutSuccessHandler(myLogoutSuccessHandler)
//删除cookie
.deleteCookies("JSESSIONID")
//再返回一个HttpSecurity http设置登录,登录默认地址为/login
.and().formLogin()
//.loginPage("/mlogin.html")
//登录页面填写完成后的提交地址,默认是/login(SpringSecurity已经默认实现了此接口)
.loginProcessingUrl("/login")
//登录页面form表单中用户名框对应的name
.usernameParameter("username")
//登录页面form表单中密码框对应的name
.passwordParameter("password")
.successHandler(myLoginSuccessHandler).permitAll()
.failureHandler(myLoginFailureHandler)
//匿名用户访问资源时无权限处理器
.and().exceptionHandling()
.authenticationEntryPoint(myAuthExceptionEntryPoint)
//已登录用户权限不足处理器
.accessDeniedHandler(myAccessDeniedHandler)
.and().sessionManagement()
.maximumSessions(1).maxSessionsPreventsLogin(false).expiredSessionStrategy(mySessionInformationExpiredStrategy);
//开启跨域访问
http.cors().disable();
//关闭跨域攻击
http.csrf().disable();
}
}
在接口中使用注解方式。可以通过and、or等方式控制权限的并/或。
@PreAuthorize("hasRole('ROLE') or hasAuthority('p1')"):拥有角色或拥有权限
@PreAuthorize("hasAuthority('p1') and hasAuthority(p2)"):同时拥有两个权限
@PreAuthorize(("#id > 100")):输入的参数满足条件。未登录用户id<100时提示未登录,未登录用户id>100时提示无权限,不管登录与否id>100提示成功。
在@PreAuthorize中使用@PreAuthorize("permitAll()")不生效。
@RequestMapping("/role")
@ResponseBody
@PreAuthorize("hasRole('ROLE') or hasAuthority('p1')")
public String role() {
String a = "role";
System.out.println(a);
return a;
}
@RequestMapping("/perm")
@ResponseBody
@PreAuthorize("hasAuthority('p1') and hasAuthority(p2)")
public String perm() {
String a = "perm";
System.out.println(a);
return a;
}
@RequestMapping("/other")
@ResponseBody
@PreAuthorize(("#id > 100"))
public String other() {
String a = "perm";
System.out.println(a);
return a;
}
以后有时间再补充@PreFilter、@PostAuthorize、@PostFilter注解使用。