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 ...
随机推荐
- MongoDB 桌面管理器MongoVUE
MongoVUE是一个桌面GUI工具,专用于Windows平台,它有一个简洁.清爽的界面,它的基本功能是免费的.它可以以文本视图.树视图.表格视图来显示MongoDB的数据.还可以保持查询的结果供以后 ...
- [C#]基于命名管道的一对多进程间通讯
在工作中碰到了一个进程间通讯的问题,大概是这样的: 项目本身是.net Core做的,但是有部分功能Core中不方便实现,有的是依赖Framework,有的是因为权限和安全问题. 那基于这个问题,问了 ...
- [模拟赛] T2 不等数列
Description 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入">"和"<".问在所有排列中,有多少个排列恰好有k个&qu ...
- AsyncTask源码笔记
AsyncTask源码笔记 AsyncTask在注释中建议只用来做短时间的异步操作,也就是只有几秒的操作:如果是长时间的操作,建议还是使用java.util.concurrent包中的工具类,例如Ex ...
- 【Linux】 升级CentOS6的内核到3.10
升级内核 最近有一些虚拟机,想装Dokcer,但是实验之后发现Docker基本上只在3.0以上的linux内核版本中才能稳定运行.所以就面临着把CentOS6的2.6内核升级到3.0以上.下面提供两种 ...
- C++顺序容器知识总结
容器是一种容纳特定类型对象的集合.C++的容器可以分为两类:顺序容器和关联容器.顺序容器的元素排列和元素值大小无关,而是由元素添加到容器中的次序决定的.标准库定义了三种顺序容器的类型:vector.l ...
- java基础--封装
封 装(面向对象特征之一):是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处:将变化隔离:便于使用:提高重用性:安全性. 封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共 ...
- [poj1068]Parencodings_模拟
Parencodings 题目大意:给你一个P序列,表示从左到右的右括号左边有多少左括号,求M序列. 注释:M序列定义为每一个右括号左边最近的没有被之前的右括号匹配的括号之间,有多少已经匹配的括号队对 ...
- KVM之十一:调整cpu和内存
1.virsh edit snale (更改前要将snale shutdown) 找到"memory"和"vcpu"标签,将 <memory unit=' ...
- oracle维护数据的完整性
介绍: 数据的完整性用于确保数据库数据遵从一定的商业的逻辑规则.在oracle中,数据完整性可以使用约束.触发器.应用程序(过程.函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的 ...