美文网首页Spring-Boot程序员技术干货
SpringBoot之整合Spring Security,为自己

SpringBoot之整合Spring Security,为自己

作者: AI码师 | 来源:发表于2018-05-08 14:49 被阅读292次
    by 杨乐

    需求:

            1.权限控制:角色有多种角色,每个角色对应多个用户,每个角色又对应不同的菜单权限

            2.资源控制:

                            ①有些地址只能当用户登录之后才能访问

                            ②有些地址可以对无状态用户开放,例如API

                            ③对不同角色的用户的访问的权限进行控制

                            ...

             3.系统登录与注销:登录成功后将用户信息保存在系统中,转向成功页面,否则重新指向到登录页面,并提示错误信息

    初步解决方案:

                使用filter完成所有需求:

                ①将用户登录的信息保存在session中,在filter进行判断,请求的地址是否是在登录  之后才能访问,然后写一堆if判断,解决问题1

              ②解决方法和问题①一样的,在filter中进行过滤

               ③对不同角色有不同的权限则也可以在filter中操作,根据用户信息查到用户所属角                                  色,再进行判断,解决问题。

                ④系统的登录和注销可以使用一个action,在action中进行这些逻辑处理。解决问题

    遇到的问题:

            在使用如上方法完成需求之后,反过来看,会发现有好多冗余代码,使系统变得臃肿,光 filter里面就会出现大量的if语句,而且系统代码并不能被下一个系统直接复用,没有将功能进行模块化的开发。

    最终解决方案:

          使用springboot 对spring security进行整合:

               为什么使用security?

                        ①Spring Security是能够为J2EE项目提供综合性的安全访问控制解决方案的安全框架;

                        ②Spring Security 完美的解决了我以上的需求

                        ③有了security我可以更加便捷的管理我的系统,拦截一个地址,不再需要我去配置一                       个filter,只需要添加一个配置就能搞定了,废话不多说进入正题吧:

    开始coding吧

    spring security的starterMaven包:

    security maven

    一、首先进行安全入口的配置:

    WebSecurityConfig.java

             WebSecurityConfig 继承WebSecurityConfigurerAdapter重写config,configureGlobal方法

    WebSecurityConfig.java

    这里面可以配置不需要拦截的url,和登录,注销后的处理页面,还能添加认证数据源,再登录时获取额外的参数,例如后面提到的验证码等参数

    WebSecurityConfig.java

    这个方法用来加载 处理登录的逻辑代码(用户名,密码,验证码等逻辑验证)

    二、用户验证

    CustAuthenticationProvider.java 实现AuthenticationProvider接口中的authenticate方法进行登录认证

    CustAuthenticationProvider.java

    三、封装用户信息类

    CustUserDetails.java 实现UserDetails接口

    CustUserDetails.java

    四、根据用户名获取用户信息

    SnailUserDetailsService.java 实现UserDetailsService接口中的loadUserByUsername方法,从数据库中加载用户信息并封装到CustUserDetails中返回

    SnailUserDetailsService.java 

    五、添加额外参数验证:

    在普通的认证中,我们只能对用户名和密码进行验证,不能够获取表单中额外参数进行验证(如验证码),但是security给我们打开了一扇门,还记得步骤一中的authenticationDetailsSource这个源码,这个就是加载额外数据源参数,我们只需创建一个类实现AuthenticationDetailsSource接口中的buildDetails方法,将我们需要的额外参数加载进来即可

    CustomAuthenticationDetailsSource.java实现AuthenticationDetailsSource接口

    CustomAuthenticationDetailsSource.java

    创建CustomWebAuthenticationDetails.java继承WebAuthenticationDetails加载参数

    CustomWebAuthenticationDetails.java

    六、到这里,所有代码都写完了,我们还有一个需求就是如何在项目中获取用户信息:security提供了SecurityContextHolder这个类,能够帮助我们获取用户的所有信息,使用方式如下:

    controller

    附上所有代码下载链接,使用时请大家根据自己的开发环境进行相应的调整,如果没有积分的可以留言,我会上传到百度云中,提供你们下载。

    csdn:https://download.csdn.net/download/weixin_34311210/10400629

    百度云:https://pan.baidu.com/s/1NNgCgk_2iqjMgq6tgeJEog

    相关文章

      网友评论

      本文标题:SpringBoot之整合Spring Security,为自己

      本文链接:https://www.haomeiwen.com/subject/uqairftx.html