基于角色或权限进行访问控制

开始吧

1、 通过 HttpSecurity 对象设置资源的角色要求

这回我把整个类拿过来,直接看注释就好了。很详细了!

测试目的:访问被拒绝后看到 403 错误页面!

/**
 * 继承WebSecurityConfigurerAdapter这个类。这个类中有Security的一些默认配置。
 * 如果不继承,启动服务器会报错:No bean named 'springSecurityFilterChain' available
 * 注意:这个类一定要被扫描到
 */
@Configuration  //标注此类未Spring的配置类,基于注解的。和xml一样一样的。
@EnableWebSecurity  //注解表示启用Web安全功能。以后会接触到很多@EnableXxx 注解,用来启用对应的功能。
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {


    //重写configure方法进行配置
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {

        httpSecurity
                //配置入口
                .authorizeRequests()                    //对请求进行授权
                .antMatchers("index.jsp","/layui/**")  //针对 /index.jsp以及layui下的内容进行授权(对哪些资源开放)
                .permitAll()                            //授权的级别:可以无条件访问(开放的级别)
                //以下是用来设置拥有什么角色才能访问什么资源
                .antMatchers("/level1/**")   //设置匹配/level1/**的地址
                .hasRole("学徒")                         //要求具备“学徒”角色
                .antMatchers("/level2/**")
                .hasRole("大师")
                .antMatchers("/level3/**")
                .hasRole("宗师")
                .anyRequest()                           //任意请求
                .authenticated()                        //需要登陆后才可以访问(如果此句代码和上句代码先调用,会把前面设置的角色代码的设置覆盖,导致角色代码无效。所以要 先做具体小范围设置,再做大范围模糊设置。)
                //以下是用户登录方法实现
                .and()
                .formLogin()                            //设置未授权请求跳转到登录页面
                .loginPage("/index.jsp")                //指定登录页面
                .loginProcessingUrl("/do/login.html")   //loginProcessingUrl()方法指定了登录地址,就会覆盖 loginPage()方法中设置的默认值 /index.jsp POST
                .permitAll()                            //为登录页面设置所有人都可以访问
                .usernameParameter("loginAcct")         //定制登录账号的请求参数名
                .passwordParameter("userPswd")          //定制登录密码的请求参数名
                .defaultSuccessUrl("/main.html")        //设置登录成功后默认前往的 URL 地址
                //以下是用户注销方法实现
                .and()
                .csrf()
                .disable()                              //禁用CSRF功能
                .logout()                               //开启退出功能
                .logoutUrl("/do/logout.html")           //指定处理退出请求的URL地址
                .logoutSuccessUrl("/index.jsp")         //退出成功后前往的 URL 地址
        ;
    }

    //重写另外一个父类的方法,来设置登录系统的账号密码(单机版,不走数据库)
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //super.configure(auth);禁用默认规则

        auth
                //配置入口
                .inMemoryAuthentication()           //在内存身份验证(单机版,不走数据库)
                //设置第一个用户
                .withUser("zhou")      //设置登录账号
                .password("123")                    //设置登录密码
                .roles("ADMIN")                     //设置角色
                //设置第二个用户
                .and()
                .withUser("qiong")     //设置另一个登录账号
                .password("234")                     //设置另一个登录密码
                .authorities("SAVE", "DEIT")         //设置权限
                //设置第三个用户
                .and()
                .withUser("yuan")
                .password("345")
                .roles("大师")
                .authorities("SAVE")
        ;
    }
}

2、 开讲一些细节,要注意的地方

SpringSecurity的源码对于角色和权限访问资源控制是一起的。这一点和RBAC模型(用户——角色——权限——资源)那种不太一样。

SpringSecurity听视频老师讲的是这个框架它把角色和权限都放进一个集合当中了。都是字符串形式的。角色有前缀的ROLE_。权限没有。前缀区分这两~

虽然debug没有找到图中老师的这几句源码。这估计和SpringSecurity版本有关。我用的较新。

不过有一个很好的收获就是慢慢学会通过Debug看源码了!~nice加油

posted @ 2020-11-07 22:38  我才不是你的谁  阅读(200)  评论(0编辑  收藏  举报