spring boot 进阶(四)springBoot安全框架

简单来说这里其实就是说说spring boot的security。因为shiro是阿帕奇的,并且和springBoot没有强绑定性。当然了最主要的原因是讲师说他们学校有别人专门讲过shiro了。别不多谈,开始说安全这一块的知识。
应用程序的两个主要区域是“认证”和"授权"(也可以叫做访问控制)。这两个主要区域是SpringSecurity的两个目标。

  • 认证:是建立在一个他声明的主体的过程(一个"主体"一般是指用户,设备或者一些可以在你应用程序种执行动作的其它系统。)
  • 授权:指确定一个主体是否允许在你的应用程序执行一个动作的过程,为了抵达需要授权的页面,主体的身份已经有认证过程建立。

(这个概念是通用的,而不是只在SpringSecurity中)
上面简单的概念说清楚了,下面具体的使用方法:

  1. 导包
    这个没啥说的,去maven仓库找就行,security有场景启动器的。


    org.springframework.boot
    spring-boot-starter-security
    2.3.7.RELEASE

  1. 编写springSecurity配置(这里用配置类的方式来写)
    • 这个类名字随意,我是叫mySecurityConfig。这样比较见名知意。
    • 这个类要继承WebSecurityConfigurerAdapter
    • 这个类上要标注@EnableWebSecurity注解
    • 控制请求的访问权限可以重写父类的configure方法
      这个重写那个方法可以酌情选择,比如我要控制请求的方式或者一些请求上指定的东西,就选择参数是http的这个


      spring boot 进阶(四)springBoot安全框架_第1张图片
      重写configure

      然后我们简单写一下自己的访问请求权限:


      spring boot 进阶(四)springBoot安全框架_第2张图片
      访问控制

      图上的代码逻辑很简单。/all下的所有路径都可以正常访问。但是/user1下的所有路径要有user1这个角色,同理user2下所有路径要有user2角色。
      下面简单写几个方法测试一下:
      spring boot 进阶(四)springBoot安全框架_第3张图片
      测试

      六个方法没啥逻辑,主要是路径。下面启动项目,我们访问试一下:


      spring boot 进阶(四)springBoot安全框架_第4张图片
      测试结果

      因为我们没有role呢,所以先不说如何让user1和user2下的如何访问,起码目前来说确实是all下正常访问,要求有role权限的也确实拦截了。说明我们的配置是生效了的。
      这里其实在这个方法中还有很多操作可以做,比如开启自动登录页跳转。就似乎发现你没权限可以自动跳转到登陆页面。就是简单的一句代码:
http.formLogin();

注意如果你自己没有登录页的话会有一个默认的登录页给你。对于一个前端渣的我来说就是用这个就可以了。如下:


spring boot 进阶(四)springBoot安全框架_第5张图片
代码和测试结果

接下来就是为用户授以角色啦。正常来讲这步要连接数据库查询用户角色的,但是因为老师偷懒所以直接用内存了。所以咱们也就这么用吧:
这里需要继承另一个configure方法来实现。代码如下:


spring boot 进阶(四)springBoot安全框架_第6张图片
用户对应角色关系

需要注意的是这里密码是有加密的过程的!!因为我用的是默认的登陆页,加密方法默认就是这个,所以用上面的代码解密就行了。

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 定义认证规则.roles("USER");
        auth.inMemoryAuthentication()
        .passwordEncoder(new BCryptPasswordEncoder()).withUser("user").password(new BCryptPasswordEncoder().encode("123")).roles("user1", "user2")
        .and()
        .passwordEncoder(new BCryptPasswordEncoder()).withUser("user1").password(new BCryptPasswordEncoder().encode("1234")).roles("user1")
        .and().
        passwordEncoder(new BCryptPasswordEncoder()).withUser("user2").password(new BCryptPasswordEncoder().encode("456")).roles("user2");
    }

(因为讲课老师自己有前端页面,所以这一步是没有的,所以我把代码贴出来大家可以参考下)
这里设置了三个角色,user是两个都有,其余的分别是名字对应角色。
下面还有一步很重要的,就是表单提交,登陆页面的提交虽然没有啥业务逻辑,但是该有还要有,这个我随便写了个方法:路径是/(我这里不确定是get还是post所以用的requestMapping("/").
因为默认页面是提交到这个路径,所以要对应写一个方法的。。。像我这样就行。下面可以开始测试啦!

  1. 先访问一个没权限没登陆的路径,果不其然跳到了登陆页


    spring boot 进阶(四)springBoot安全框架_第7张图片
    登陆页

    而且我还测试了下填错误的密码,也会报错。。挺好的,哈哈。

  2. 正确的密码登陆后,成功访问了需要权限的页面
    spring boot 进阶(四)springBoot安全框架_第8张图片
    登陆成功后访问了user2下请求

    这里有一点如果是测试的话千万不要记住密码。。不然哪怕重新打开窗口也是这个用户了。然后登陆成功后在当前页就可以访问当前登陆角色的菜单和不是他的菜单,很容易就能看出来接口权限是正确的了。
    spring boot 进阶(四)springBoot安全框架_第9张图片
    用user2登陆

    user2应该有all的权限和user2/的权限而没有user1/的权限
    spring boot 进阶(四)springBoot安全框架_第10张图片
    访问user2成功

    spring boot 进阶(四)springBoot安全框架_第11张图片
    访问user1/**失败

    至此,说明测试是成功的!
    刚刚我们说过了记住密码就一直会存在这个cookie。这个时候就需要注销啦!其实这里也简单的,直接logout访问就ok:
    spring boot 进阶(四)springBoot安全框架_第12张图片
    logout默认页

    这个时候我们点一下logOut就会注销。下次再访问又会重新跳转登陆页了。
    感觉剩下的大概都是前端的东西了。只要知道比如根据觉得获取菜单(用户登陆以后返回拥有的菜单列表),还有记住某用户(这个浏览器大多数都能实现记住用户名密码啥的),我就不说了,反正如果不是前后端分离的项目应该都挺有用的,但是对前端避而远之的我实在有点不想学,所以这一块spring security已经会简单的使用了就不再说了。

本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,2020倒数第二天,祝大家身体健健康康吧!希望2020不留遗憾,2021一往无前!大家共勉!

你可能感兴趣的:(spring boot 进阶(四)springBoot安全框架)