Spring Security 入门(1-3-1)Spring Security - http元素 - 默认登录和登录定制

登录表单配置 - http 元素下的 form-login 元素是用来定义表单登录信息的。当我们什么属性都不指定的时候 Spring Security 会为我们生成一个默认的登录页面。
如果不想使用默认的登录页面,我们可以指定自己的登录页面。
1、使用自定义登录页面和为登录页面放行
1.1、使用自定义登录页面
自定义登录页面是通过 login-page 属性来指定的。提到 login-page 我们不得不提另外几个属性。
- username-parameter:表示登录时用户名使用的是哪个参数,默认是 “
j_username”。 - password-parameter:表示登录时密码使用的是哪个参数,默认是 “
j_password”。 - login-processing-url:表示登录时提交的地址,默认是 “
/j-spring-security-check”。这个只是 Spring Security 用来标记登录页面使用的提交地址,真正关于登录这个请求是不需要用户自己处理的。
所以,我们可以通过如下定义使 Spring Security 在需要用户登录时跳转到我们自定义的登录页面。
<security:http auto-config="true">
<security:form-login login-page="/login.jsp"
login-processing-url="/login.do"
username-parameter="username"
password-parameter="password" />
<!-- 表示匿名用户可以访问 -->
<security:intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
1.2、为登录页面放行
需要注意的是,我们之前配置的是所有的请求都需要 ROLE_USER 权限,
这意味着我们自定义的 “/login.jsp” 也需要该权限,这样就会形成一个死循环了。解决办法是我们需要给 “/login.jsp” 放行。
- 通过指定 “/login.jsp” 的访问权限为 “
IS_AUTHENTICATED_ANONYMOUSLY” 或 “ROLE_ANONYMOUS” 可以达到这一效果。 - 此外,我们也可以通过指定一个 http 元素的安全性为 none 来达到相同的效果。
如:
<security:http security="none" pattern="/login.jsp" /> --如果请求url匹配,这个http对应filterChain上的filters生效,其他http对应filterChain不再检查。
<security:http auto-config="true">
<security:form-login login-page="/login.jsp" login-processing-url="/login.do" username-parameter="username" password-parameter="password" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
它们两者的区别是前者将进入 Spring Security 为该http定义的一系列用于安全控制的 filter,而后者不会。
当指定一个 http 元素的 security 属性为 none 时,表示其对应 pattern 的 filterChain上的filter为空。
从 3.1 开始,Spring Security 允许我们定义多个 http 元素以满足针对不同的 pattern 请求使用不同的 filter 链。(<--important !!!!!!)
根据上面的配置,我们自定义的登录页面的内容应该是这样子的:
<form action="login.do" method="post">
<table>
<tr>
<td> 用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td> 密码:</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value=" 登录 "/>
<input type="reset" value=" 重置 "/>
</td>
</tr>
</table>
</form>
2、指定登录后的页面和登录后的处理
2.1、登录成功后页面和登录成功后处理
2.1.1、登录成功后页面(default-target-url)
默认情况下,我们在登录成功后会返回到原本受限制的页面。
但如果用户是直接请求登录页面,登录成功后应该跳转到哪里呢?
默认情况下它会跳转到当前应用的根路径,即欢迎页面。
通过指定 form-login 元素的 default-target-url 属性,我们可以让用户在直接登录后跳转到指定的页面。
如果想让用户不管是直接请求登录页面,还是通过 Spring Security 引导过来的,登录之后都跳转到指定的页面,
我们可以通过指定 form-login 元素的 always-use-default-target 属性为 true 来达到这一效果。
2.1.2、登录成功后处理(authentication-success-handler-ref,同时default-target-url将失效)
authentication-success-handler-ref 对应一个 AuthencticationSuccessHandler 实现类的引用。
如果指定了 authentication-success-handler-ref,登录认证成功后会调用指定 AuthenticationSuccessHandler 的 onAuthenticationSuccess 方法。
我们需要在该方法体内对认证成功做一个处理,然后返回对应的认证成功页面。
使用了 authentication-success-handler-ref 之后认证成功后的处理就由指定的 AuthenticationSuccessHandler 来处理,
之前的那些 default-target-url 之类的就都不起作用了。
以下是自定义的一个 AuthenticationSuccessHandler 的实现类。
publicclass AuthenticationSuccessHandlerImpl implements
AuthenticationSuccessHandler {
publicvoid onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
response.sendRedirect(request.getContextPath());
}
}
其对应使用 authentication-success-handler-ref 属性的配置是这样的:
<security:http auto-config="true">
<security:form-login login-page="/login.jsp"
login-processing-url="/login.do" username-parameter="username"
password-parameter="password"
authentication-success-handler-ref="authSuccess"/>
<!-- 表示匿名用户可以访问 -->
<security:intercept-url pattern="/login.jsp"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
<!-- 认证成功后的处理类 -->
<bean id="authSuccess" class="com.xxx.AuthenticationSuccessHandlerImpl"/>
2.2、登录失败后页面和登录失败后处理
除了可以指定登录认证成功后的页面和对应的 AuthenticationSuccessHandler 之外,form-login 同样允许我们指定认证失败后的页面和对应认证失败后的处理器 AuthenticationFailureHandler。
2.2.1、登录失败后页面(authentication-failure-url)
默认情况下登录失败后会返回登录页面,我们也可以通过 form-login 元素的 authentication-failure-url 来指定登录失败后的页面。
需要注意的是登录失败后的页面跟登录页面一样也是需要配置成在未登录的情况下可以访问,否则登录失败后请求失败页面时又会被 Spring Security 重定向到登录页面。
<security:http auto-config="true">
<security:form-login login-page="/login.jsp"
login-processing-url="/login.do" username-parameter="username"
password-parameter="password"
authentication-failure-url="/login_failure.jsp"
/>
<!-- 表示匿名用户可以访问 -->
<security:intercept-url pattern="/login*.jsp*"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
2.2.1、登录失败后处理(authentication-failure-handler-ref,同时authentication-failure-url将失效)
类似于 authentication-success-handler-ref,authentication-failure-handler-ref 对应一个用于处理认证失败的 AuthenticationFailureHandler 实现类。
指定了该属性,Spring Security 在认证失败后会调用指定 AuthenticationFailureHandler 的 onAuthenticationFailure 方法对认证失败进行处理,
此时 authentication-failure-url 属性将不再发生作用。
3、Spring-Security的弹窗认证(http元素下的http-basic元素)
之前介绍的都是基于 form-login 的表单登录,其实 Spring Security 还支持弹窗进行认证。通过定义 http 元素下的 http-basic 元素可以达到这一效果。
<security:http auto-config="true">
<security:http-basic/>
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
此时,如果我们访问受 Spring Security 保护的资源时,系统将会弹出一个窗口来要求我们进行登录认证。效果如下:

当然此时我们的表单登录也还是可以使用的,只不过当我们访问受包含资源的时候 Spring Security 不会自动跳转到登录页面。
这就需要我们自己去请求登录页面进行登录。
需要注意的是当我们同时定义了 http-basic 和 form-login 元素时,form-login 将具有更高的优先级。
即在需要认证的时候 Spring Security 将引导我们到登录页面,而不是弹出一个窗口。
Spring Security 入门(1-3-1)Spring Security - http元素 - 默认登录和登录定制的更多相关文章
- Spring Security 入门(1-6-1)Spring Security - 配置文件解析和访问请求处理
1.在pom.xml中添加maven坐标 <dependency> <groupId>org.springframework.security</groupId> ...
- Spring Security 入门(1-7)Spring Security - Session管理
参考链接:https://xueliang.org/article/detail/20170302232815082 session 管理 Spring Security 通过 http 元素下的子元 ...
- Spring Security 入门(1-3-5)Spring Security - remember me!
Remember-Me 功能 概述 Remember-Me 是指网站能够在 Session 之间记住登录用户的身份,具体来说就是我成功认证一次之后在一定的时间内我可以不用再输入用户名和密码进行登录了, ...
- Spring Security 入门(1-6-2)Spring Security - 内置的filter顺序、自定义filter、http元素和对应的filterChain
Spring Security 的底层是通过一系列的 Filter 来管理的,每个 Filter 都有其自身的功能,而且各个 Filter 在功能上还有关联关系,所以它们的顺序也是非常重要的. 1.S ...
- Spring Security 入门(1-3-2)Spring Security - http元素 - intercept-url配置
http元素下可以配置登录页面,也可以配置 url 拦截. 1.直接配置拦截url和对应的访问权限 <security:http use-expressions="false" ...
- Spring Security 入门(1-4-2)Spring Security - 认证过程之AuthenticationProvider的扩展补充说明
1.用户信息从数据库获取 通常我们的用户信息都不会向第一节示例中那样简单的写在配置文件中,而是从其它存储位置获取,比如数据库.根据之前的介绍我们知道用户信息是通过 UserDetailsService ...
- Spring Security 入门(1-2)Spring Security - 从 配置例子例子 开始我们的学习历程
1.Spring Security 的配置文件 我们需要为 Spring Security 专门建立一个 Spring 的配置文件,该文件就专门用来作为 Spring Security 的配置. &l ...
- Spring Security入门(2-3)Spring Security 的运行原理 4 - 自定义登录方法和页面
参考链接,多谢作者: http://blog.csdn.net/lee353086/article/details/52586916 http元素下的form-login元素是用来定义表单登录信息的. ...
- Spring Security 入门(3-11)Spring Security 的使用-自定义登录验证和回调地址
配置文件 security-ns.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
随机推荐
- 基于docer搭建私有gitlab服务器
今天闲着无聊,于是乎想用最近很流行的docker容器搭建一个自己的gitlab的服务器,关于docker和gitlab就不多介绍了,网上查了很多资料,貌似没有一个统一的方法,很乱很杂,而且很容易误导人 ...
- UML系列图
用例图: 时序图:
- Java测试(一)
关于while和do-while循环,下列说法正确的是 A 两种循环除了格式不同外,功能完全相同 B 与do-while语句不通的是,while语句的循环至少执行一次 C do-while语句首 ...
- 二分查找的变种(Java实现)
普通二分查找: 先回顾一下普通的二分查找 注意:二分查找有这样一个问题:当数组中数有重复时,比如 {3,3,3,3} 这个数组,二分查找3时,返回的是arr[1],也就是说二分查找并不会返回3第一次出 ...
- Object.prototype.hasOwnProperty与Object.getOwnPropertyNames
Object.prototype.hasOwnProperty() 所有继承了 Object 的对象都会继承到 hasOwnProperty 方法.这个方法可以用来检测一个对象是否含有特定的自身属性: ...
- Object.defineProperty实现数据绑定
1.Object.defineProperty方法 Object.defineProperty(obj, prop, descriptor); (1)参数: obj:目标对象 prop:需要定义的属 ...
- mysql多实例运行
1.主配置文件 [mysqld_multi] mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/m ...
- 网络通信 --> Linux 五种IO模型
Linux 五种IO模型 聊聊Linux 五种IO模型
- 3.Properties文件的加载和使用
一.Properties简介 Properties 类继承自HashTable,提供的方法很像Map的实现类HashMap.它在 Java 编程的早期就有了,并且几乎没有什么变化.J2SE 的 Tig ...
- 常用七大经典排序算法总结(C语言描述)
简介 其中排序算法总结如下: 一.交换排序 交换排序的基本思想都为通过比较两个数的大小,当满足某些条件时对它进行交换从而达到排序的目的. 1.冒泡排序 基本思想:比较相邻的两个数,如果前者比后者大,则 ...