• spring-security-4 (5)spring security Java配置实现自定义表单认证与授权


       前面三篇讲解了spring security的搭建以及简单的表单认证与授权原理。本篇将实现我们自定义的表单登录与认证。

       本篇不会再讲项目的搭建过程,因为跟第二节的搭建如出一辙。本篇也不会将项目中所有的代码全部给出,因为代码量有点大。项目的代码被放在了github上,请拉下来根据讲解去看代码,代码的注释写的也比较详细。github地址https://github.com/wutianqi/spring_security_extend.git。另外,因为项目中使用了mysql数据库,对于表结构和数据这里截图会很明白的给出。

    一、项目结构及表结构

    1.项目结构

    2.表结构

      数据库名:

      角色表(role):

      用户表(user):

      用户角色表(user_role):

    二、项目功能

      在讲解代码之前还是要介绍一下本项目利用spring security实现的功能,便于读者分析代码。

      1. 本项目围绕着admin.jsp,user.jsp,other.jsp展开。

          a. admin.jsp只有admin角色的用户才可以访问,ls拥有admin角色。

          b. user.jsp有user角色或admin角色都可以访问,zs拥有user角色。

          c. other.jsp只要用户登录就可以访问,ww什么角色都没有。为了简单起见,项目中other.jsp就代表其他任何登录后就可以访问的路径

      2. 用户访问受保护的页面时,会被要求登录:

      3.用户在登录时,如果用户名或密码输入错误,会在登录页提示

      4.登录成功后,如果有权限访问请求的页面,则会跳到该页面,比如拥有user角色的zs登录后,访问user.jsp

      相反,如果访问只有admin角色才可以访问的admin.jsp,则会提示权限不足

      5.点击退出登录,则会提示退出成功

      6.不需登录就可以访问的页面,可以不登录直接访问,比如项目的index.jsp

    三、代码解读

      关于spring security认证与授权原理的讲解在前一篇讲的比较清楚了,这里不再详细介绍,这里只介绍一下自己认为比较重要的代码。如果读者有什么疑问,请留言,我会及时解答!

      1.MySecurityConfig

      spring secuirty提供了一种后处理bean方式提供一个自定义配置过滤器的口子,就是下面这段代码

      这段代码对FilterSecurityInterceptor的AccessDecisionManager属性进行了自定义的配置。目的是让spring security用我们自定义的AccessDecisionManager。

      2.MyAccessDecisionManager

      在用户没有登录时,decide中的authentication参数是AnonymousAuthenticationToken,此时他会有ROLE_ANONYMOUS的角色,就是匿名角色。这是AnonymousAuthenticationFilter来做的。

      这样下面这段代码就好理解了

    if(authorityString.contains("ROLE_ANONYMOUS")) {
                //未登录
                throw new AccessDeniedException("未登录");
    }

       3.MyAuthenticationProvider

      我们的MyAuthenticationProvider继承了AbstractUserDetailsAuthenticationProvider,我们自定义provider的真正认证过程实际发生在AbstractUserDetailsAuthenticationProvider的authenticate中。我们的MyAuthenticationProvider只是实现了retrieveUser来获取用户信息并在其中检查用户名是否存在,以及实现了additionalAuthenticationChecks检验用户输入的密码。其他一些诸如填充完整的Authentication的行为交给父类来做了。因为父类处理的很好所以我们无须自己再做。MySuccessHandler也是将认证成功后的处理都交给父类去处理了。

    四、总结

      要对本节的代码做到理解。上篇博文的讲解至关重要。

      本spring security系列,只是对我们web应用中常见的表单认证与登录进行了讲解。spring security还有很多安全功能。比如方法安全,域安全等。本文没有进行讲解。想了解更多,可以查看官方文档。自己以后也会再学,到时候也会再写相关博文。

      最后,对于本文有疑问的地方欢迎提问!

    参考资料:http://www.tianshouzhi.com/api/tutorials/spring_security_4/250

         https://docs.spring.io/spring-security/site/docs/4.1.3.RELEASE/reference/htmlsingle/

  • 相关阅读:
    iOS 两种易混淆的存储路径
    'Could not load NIB in bundle: 'NSBundle xxx/storeFlix.app> ' with name 'UIViewController-w6Q-ra-j06' and directory 'StoreFlixIpad.storyboardc
    [友盟微博分享]does not contain bitcode. You must rebuild it with
    ZT android -- 蓝牙 bluetooth (四)OPP文件传输
    ZT android -- 蓝牙 bluetooth (二) 打开蓝牙
    ZT android -- 蓝牙 bluetooth (五)接电话与听音乐
    ZT android -- 蓝牙 bluetooth (一) 入门
    ZT extern "C"的用法解析
    转自csdn:计算机启动过程
    年份的读法与读数字不同
  • 原文地址:https://www.cnblogs.com/wutianqi/p/9219042.html
Copyright © 2020-2023  润新知