SpringBoot集成SpringSecurity(五)授权控制

授权控制

授权包括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注解使用。

上一篇:springSecurity配置文件 头


下一篇:SpringSecurity 自定义 AccessDeniedHandler 不生效的问题解决