Spring Security教程(四):自定义登录页
Spring Security教程(四):自定义登录页
在前面的例子中,登陆页面都是用的Spring Security自己提供的,这明显不符合实际开发场景,同时也没有退出和注销按钮,因此在每次测试的时候都要通过关闭浏览器来注销达到清除session的效果。
一、自定义页面
login.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>第一个HTML页面</title> </head> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 自定义表单验证: <!--<form name="f" action="/login" method="post">--> <form name="f" action="/authentication/form" method="post"> <br/> 用户名: <input type="text" name="username"><br/> 密码: <input type="password" name="password" ><br/> <input type="checkbox" name="remember_me" />记住我<br /> <input name="submit" type="submit" value="提交"> </form> </body> </html>
- 特别要注意的是form表单的action是提交登陆信息的地址,这是security内部定义好的,默认使用post提交,路径是/login,这里我们自定义为/authentication/form
- username,password输入登陆名的参数名称。security默认是这个名字,可以自己改
- remember_me,选择是否允许自动登录的参数名称。可以直接把这个参数设置为一个checkbox,无需设置value,Spring Security会自行判断它是否被选中,这也是security内部提供的,只需要配置,不需要自己实现。
二、配置制定的登陆页面
配置文件如下:
<security:http >
<security:intercept-url pattern="/admin.jsp" access="hasAnyRole('ROLE_ADMIN')"/>
<security:intercept-url pattern="/login.html" access="permitAll()"/>
<security:intercept-url pattern="/**" access="hasAnyAuthority('ROLE_ADMIN,ROLE_USER')"/>
<security:form-login login-page="/login.html" username-parameter="username" password-parameter="password"
login-processing-url="/authentication/form" authentication-failure-url="/error.jsp"
authentication-success-forward-url="/index.jsp"/>
<security:logout logout-url="/logout_zy" invalidate-session="true"/>
<security:csrf disabled="true"/>
</security:http>
配置的登陆成功后的页面,index.jsp上面自定义了退出登录
<html>
<body>
<h2>登陆成功,欢迎来到首页</h2>
<form name="f" action="/logout_zy" method="post">
<br/>
退出:
<input type="submit" value="退出"><br/>
</body>
</html>
- form-login这个标签是配置登陆页面的
-
login-page="/login.html" 自定义的登陆页面
-
username-parameter="username" password-parameter="password" 可以在这里更改自定义的参数名称
-
login-processing-url="/authentication/form" 登陆的路径,security默认的/login,这里是我们自定义的
-
authentication-failure-url="/error.jsp" 登陆错误的页面
-
authentication-success-forward-url="/index.jsp" 登陆成功后的跳转页面
- 在上面的配置中,登陆页面肯定是不能拦截的,任何人都应该可以访问,<intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />配置表示允许匿名用户访问,就是不用身份都可以访问;
- logout这个标签用来配置退出或者注销,其中的属性invalidate-session,配置否是要清除session,logout-success-url配置注销成功后的跳转页面,logout-url="/logout_zy",security默认的路径是/logout,delete-cookies="JSESSIONID",退出登录后删除cookie,这样防止退出后,你没关闭浏览器,他还会带着之前的cokie请求访问。
配置文件中的其他配置在前面几篇博客中都有详细的讲解,这里就不赘述了。
三、整体配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <context:component-scan base-package="com.zy"> <!--application父容器步扫描controller注解,这样两个配置文件各自各负责各自的--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--数据库连接信息--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="123456" /> <!-- 配置监控统计拦截的filters --> <property name="filters" value="stat" /> <!-- 配置初始化大小、最小、最大 --> <property name="maxActive" value="20" /> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxOpenPreparedStatements" value="20" /> </bean> <!--配置mybatis--> <!-- 配置SqlSessionFactoryBean --> <bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定连接源 --> <property name="dataSource" ref="dataSource"/> <!-- 指定映射文件 --> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <!-- 扫描指定包下的接口,自动生成代理类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.zy.dao"/> </bean> <!--<bean id="userService" class="com.zy.service.UserServiceImpl"></bean>--> <!--security配置--> <security:http auto-config="true"> <security:intercept-url pattern="/admin.jsp" access="hasAnyRole('ROLE_ADMIN')"/> <security:intercept-url pattern="/login.html" access="permitAll()"/> <security:intercept-url pattern="/**" access="hasAnyAuthority('ROLE_ADMIN,ROLE_USER')"/> <security:form-login login-page="/login.html" username-parameter="username" password-parameter="password" login-processing-url="/authentication/form" authentication-failure-url="/error.jsp" authentication-success-forward-url="/index.jsp"/> <security:logout logout-url="/logout_zy" invalidate-session="false" logout-success-url="/login.html"/> <security:csrf disabled="true"/> </security:http> <security:authentication-manager> <security:authentication-provider> <!--使用自定义的表结构--> <security: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=?"/> <!--使用sucrity内置的内存数据库--> <!--<security:user-service>--> <!--<security:user name="admin" password="admin" authorities="ROLE_ADMIN,ROLE_USER"/>--> <!--<security:user name="user" password="user" authorities="ROLE_USER"/>--> <!--</security:user-service>--> <security:password-encoder ref="noOpPasswordEncoder"/> </security:authentication-provider> </security:authentication-manager> <bean id="noOpPasswordEncoder" class="org.springframework.security.crypto.password.NoOpPasswordEncoder"/> </beans>
四、结果

当输入普通用户的用户名和密码,同时勾选2周不用登陆后,因为adminPage.jsp页面要有管理员权限才能访问,所以普通用户访问失败,index.jsp页面就可以访问;这时关闭页面后,再次访问资源,因为勾选了2周不用登陆,所以可以成功访问;但是当点击退出登录后,再次访问是就会跳转到登陆页面,要求登陆才能访问。
当输入管理员名和密码,同时勾选2周不用登陆,验证成功后,跳转到index.jsp,同时admin.jsp也可以访问,这时把一个页面关闭再重新访问资源时,因为勾选不用登陆,所以可以成功访问;然后注销,这是再访问资源时,就会跳转到登陆页面,要求登陆才能访问。
点击了退出之后,就跳转到登陆页面。

浙公网安备 33010602011771号