前面三篇讲解了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/

spring-security-4 (5)spring security Java配置实现自定义表单认证与授权的更多相关文章

  1. SpringBoot集成Spring Security(4)——自定义表单登录

    通过前面三篇文章,你应该大致了解了 Spring Security 的流程.你应该发现了,真正的 login 请求是由 Spring Security 帮我们处理的,那么我们如何实现自定义表单登录呢, ...

  2. spring security 表单认证的流程

    spring security表单认证过程 表单认证过程 Spring security的表单认证过程是由org.springframework.security.web.authentication ...

  3. Spring入门(8)-基于Java配置而不是XML

    Spring入门(8)-基于Java配置而不是XML 本文介绍如何应用Java配置而不是通过XML配置Spring. 0. 目录 声明一个简单Bean 声明一个复杂Bean 1. 声明一个简单Bean ...

  4. spring security 之自定义表单登录源码跟踪

    ​ 上一节我们跟踪了security的默认登录页的源码,可以参考这里:https://www.cnblogs.com/process-h/p/15522267.html 这节我们来看看如何自定义单表认 ...

  5. activiti自定义流程之自定义表单(一):环境配置

    先补充说一下自定义流程整个的思路,自定义流程的目的就是为了让一套代码解决多种业务流程,比如请假单.报销单.采购单.协作单等等,用户自己来设计流程图. 这里要涉及到这样几个基本问题,一是不同的业务需求, ...

  6. SharePoint 2013 表单认证使用ASP.Net配置工具添加用户

    前 言 上面一篇博客,我们了解到如何为SharePoint 2013配置表单身份认证,但是添加用户是一个麻烦事儿:其实,我们还可以用Asp.Net的配置工具,为SharePoint 2013添加表单用 ...

  7. SharePoint 2013 表单认证使用ASP.Net配置工具加入用户

    前 言 上面一篇博客,我们了解到怎样为SharePoint 2013配置表单身份认证.可是加入用户是一个麻烦事儿:事实上,我们还能够用Asp.Net的配置工具,为SharePoint 2013加入表单 ...

  8. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

  9. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

随机推荐

  1. python中的排序

    今天在http://www.pythontip.com刷题的时候遇到一个排序的问题:一个列表中既有字符串,又有数字,该怎么排序. list = [1,2,5,4,'d','s','e',45] lis ...

  2. BZOJ 5102: [POI2018]Prawnicy

    考虑最优解的集合中一定有一个$l$最大的,我们就去枚举左端点,把所有$l$小于等于它的全丢进堆里,取前$k$个即可. #include <bits/stdc++.h> using name ...

  3. 什么是ASCII码文本文件

    标准ASCII码方式(也称文本方式)存储的文件,更确切地说,英文.数字等字符存储的是ASCII码.文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车.换行等信息)外,不能存储其他任 ...

  4. 【运维技术】shell脚本实现线程挂掉,自动重启功能

    由于分布式系统的流行,服务器上面部署的项目都是多实例的.而我又希望有一个功能,当服务器出现异常情况能够自动重启实例. 所以我想到了使用shell脚本监控实例进程id,如果不存在的话,就重启对应的实例. ...

  5. Python笔记 #09# Basic plots with matplotlib

    源:DataCamp 气泡的大小表示人口的多少,横坐标表示人均GDP(美元),纵坐标表示预期寿命.-- 作者:Hans Rosling Python 中有许许多多用于可视化的包,而 matplotli ...

  6. HDU 6315 Naive Operations(线段树+区间维护)多校题解

    题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...

  7. Python学习札记(二十六) 函数式编程7 修饰器

    修饰器 NOTE 1.函数对象有一个__name__属性,可以拿到函数的名字: #!/usr/bin/env python3 def now(): print('2017/2/19') def mai ...

  8. LA 6892 The Safe Secret(矩阵连乘)

    https://vjudge.net/problem/UVALive-6892 题意: 给出n个数字和n个符号(+,-,*和?),?可以为+,-,*中任意一个,现在要计算出这个式子的最小值和最大值,并 ...

  9. Question: Database Of Tumor Suppressors And/Or Oncogenes

    https://www.biostars.org/p/15890/     71   5.9 years ago by Malachi Griffith ♦16k Washington Univers ...

  10. 探索解析微服务下的RabbitMQ

    概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...