Spring Security教程(四)
来源:互联网 发布:打码系统源码 编辑:程序博客网 时间:2024/06/05 00:21
在前面三个博客的例子中,登陆页面都是用的Spring Security自己提供的,这明显不符合实际开发场景,同时也没有退出和注销按钮,因此在每次测试的时候都要通过关闭浏览器来注销达到清除session的效果。
一 自定义页面
login.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>自定义登陆页面</title></head><body><div class="error ${param.error == true ? '' : 'hide'}">登陆失败<br>${sessionScope['SPRING_SECURITY_LAST_EXCEPTION'].message}</div><form method="post" action="${pageContext.request.contextPath}/j_spring_security_check" style="width:260px; text-align: center"><fieldset><legend>登陆</legend>用户: <input type="text" name="j_username" style="width: 150px;"value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}" /><br />密码: <input type="password" name="j_password" style="width: 150px;" /><br /><input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆<br /><input type="submit" value="登陆" /> <input type="reset" value="重置" /></fieldset></form></body></html>说明:
- 特别要注意的是form表单的action是提交登陆信息的地址,这是security内部定义好的,同时自定义form时,要把form的action设置为/j_spring_security_check。注意这里要使用绝对路径,避免登陆页面存放的页面可能带来的问题。
j_username,输入登陆名的参数名称,j_password,输入密码的参数名称,这两个正常情况下也不会修改。
_spring_security_remember_me,选择是否允许自动登录的参数名称。可以直接把这个参数设置为一个checkbox,无需设置value,Spring Security会自行判断它是否被选中,这也是security内部提供的,只需要配置,不需要自己实现。
二 配置制定的页面
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"><!-- <http pattern="/login.jsp" security="none"></http> --><http auto-config="false"> <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/adminPage.jsp" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true" /> <logout invalidate-session="true" logout-success-url="/login.jsp" logout-url="/j_spring_security_logout"/> </http><!-- 数据源 --><beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><!-- 此为c3p0在spring中直接配置datasource c3p0是一个开源的JDBC连接池 --><beans:property name="driverClass" value="com.mysql.jdbc.Driver" /><beans:property name="jdbcUrl"value="jdbc:mysql://localhost:3306/springsecuritydemo?useUnicode=true&characterEncoding=UTF-8" /><beans:property name="user" value="root" /><beans:property name="password" value="" /><beans:property name="maxPoolSize" value="50"></beans:property><beans:property name="minPoolSize" value="10"></beans:property><beans:property name="initialPoolSize" value="10"></beans:property><beans:property name="maxIdleTime" value="25000"></beans:property><beans:property name="acquireIncrement" value="1"></beans:property><beans:property name="acquireRetryAttempts" value="30"></beans:property><beans:property name="acquireRetryDelay" value="1000"></beans:property><beans:property name="testConnectionOnCheckin" value="true"></beans:property><beans:property name="idleConnectionTestPeriod" value="18000"></beans:property><beans:property name="checkoutTimeout" value="5000"></beans:property><beans:property name="automaticTestTable" value="t_c3p0"></beans:property></beans:bean><authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password,status as enabled from user where username = ?" authorities-by-username-query="select user.username,role.name from user,role,user_role where user.id=user_role.user_id and user_role.role_id=role.id and user.username=?"/> </authentication-provider></authentication-manager></beans:beans>说明:
- form-login这个标签是配置登陆页面的,其中的属性login-page是配置登陆页面的,default-target-url配置登陆成功后跳转到的页面,authentication-failure-url配置认证失败后的跳转页面。
- 在上面的配置中,登陆页面肯定是不能拦截的,任何人都应该可以访问,<intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />配置表示允许匿名用户访问,就是不用身份都可以访问;还有另一种配置方式:<http pattern="/login.jsp" security="none"></http>,这种配置达到的目的都是一样的。
- logout这个标签用来配置退出或者注销,其中的属性invalidate-session,配置否是要清除session,logout-success-url配置注销成功后的跳转页面,logout-url提交退出或者注销的地址,因此我们在配置退出或者注销的时候,只需要将url设置为/j_spring_security_logout即可,这个地址也是security内部实现了的。
- form-login标签中还有一个特别要注意的属性use-expressions,如果设置为true,这配置access就要做相应的改变,否则项目启动的时候会报错,错误如下:
<http auto-config="false" use-expressions="true"> <intercept-url pattern="/login.jsp" access="permitAll" /> <intercept-url pattern="/adminPage.jsp" access="hasRole('ROLE_ADMIN')" /> <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true" /> <logout invalidate-session="true" logout-success-url="/login.jsp" logout-url="/j_spring_security_logout"/> </http>配置文件中的其他配置在前面几篇博客中都有详细的讲解,这里就不赘述了。
三 其他文件
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><h1>this is a user page</h1><a href="${pageContext.request.contextPath}/j_spring_security_logout">退出登陆</a></body></html>
adminPage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><h1>this is a admin page</h1><a href="${pageContext.request.contextPath}/j_spring_security_logout">退出登陆</a></body></html>
这里定义了两个页面,index.jsp用户和管理员都可以访问,adminPage.jsp只有管理员可以访问,同时两个页面都有注销按钮,注销按钮提交的地址也就是上面配置文件中的地址/j_spring_security_logout。
pom.xml和前面的一样,这里就不贴了。四 结果
当输入普通用户的用户名和密码,同时勾选2周不用登陆后,因为adminPage.jsp页面要有管理员权限才能访问,所以普通用户访问失败,index.jsp页面就可以访问;这时关闭页面后,再次访问资源,因为勾选了2周不用登陆,所以可以成功访问;但是当点击退出登录后,再次访问是就会跳转到登陆页面,要求登陆才能访问。
当输入管理员名和密码,同时勾选2周不用登陆,验证成功后,跳转到index.jsp,同时adminPage.jsp也可以访问,这时把一个页面关闭再重新访问资源时,因为勾选2周不用登陆,所以可以成功访问;然后注销,这是再访问资源时,就会跳转到登陆页面,要求登陆才能访问。
3 0
- Spring Security教程(四)
- spring security(四)
- spring security详解教程
- spring security 教程入门
- spring security教程
- Spring Security教程
- Spring Security教程目录
- Spring Security教程(一)
- Spring Security教程(二)
- Spring Security教程(三)
- Spring Security教程(五)
- Spring Security教程(六)
- Spring Security教程(七)
- Spring Security教程
- spring security教程
- Spring security学习笔记四
- spring security 初次涉猎四
- Spring Security 相关教程集合
- 们只是「电脑玩物」 首页 实用技巧 免费资源 超好玩的游戏 软件推荐 IT技术 资讯 编程 其它 MVVM设计模式和WPF中的实现(四) 事件绑定 07net01.com 发布于 2015-10-08
- windows下基于Python的定时服务程序
- hello blog!
- 程序实训—小学生考试系统
- DECLARE_WAITQUEUE 将进程加入等待队列
- Spring Security教程(四)
- 用esclipse和Myesclipse创建servlet些许不同
- ajax pending indefinitely
- mysql使用profile分析语句性能消耗
- 程序设计:电子词典
- BZOJ3223 文艺平衡树
- MVVM设计模式和WPF中的实现 (事件绑定)
- 关于jquery中offset pageX pageY position scrollTop scrollLeft的区分
- 逻辑运算符和循环辅助手段