上次编写了一个能够运行的Demo程序,但不是很符合实际,很少人将用户名和密码配置到文件当中去吧,今天想给这个Demo添加如下功能:
1)用户名和密码要存在数据库当中;
2)自定义登录界面;
3)admin用户和user用户看到了index.jsp文件内容要不同,admin用户可以多看到一个admin.jsp的连接。
好了,开始今天的程序,首先要添加MYSQL的jdbc驱动、commons-dbcp-1.4.jar、commons-pool-1.5.5.jar和org.springframework.transaction-3.0.6.RELEASE.jar(在Spring Security中没有提供,需要自己下载):
一,从数据库中读取用户名和密码
1.新建数据库表,数据库用的是MySQL
user表
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
`enabled` tinyint(1) NOT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES ('root', 'root', '1');
INSERT INTO `users` VALUES ('user', 'user', '1');
authorities表
DROP TABLE IF EXISTS `authorities`;
CREATE TABLE `authorities` (
`username` varchar(50) NOT NULL,
`authority` varchar(50) NOT NULL,
KEY `fk_authorities_users` (`username`),
CONSTRAINT `fk_authorities_users` FOREIGN KEY (`username`) REFERENCES `users` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of authorities
-- ----------------------------
INSERT INTO `authorities` VALUES ('root', 'ROLE_ADMIN');
INSERT INTO `authorities` VALUES ('user', 'ROLE_USER');
INSERT INTO `authorities` VALUES ('root', 'ROLE_USER');
2.修改springContext-security.xml
将
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="user" password="user" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
替换为
<authentication-manager>
<authentication-provider user-service-ref='myUserDetailsService'/>
</authentication-manager>
<beans:bean id="myUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<beans:property name="dataSource" ref="dataSource"/>
</beans:bean>
3.定义数据源(我是新建了一个springContext-business.xml文件,并并在web.xml的context-param中添加路径信息)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
现在再运行一下程序,可以了吧。
现在还有一个问题:对于遗留系统,数据库的表是不能修改的,可以将myUserDetailsService 这个Bean修改为:
<beans:bean id="myUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<beans:property name="dataSource" ref="dataSource"/>
<beans:property name="usersByUsernameQuery" value="select username,password,enabled from users where username=?"/>
<beans:property name="authoritiesByUsernameQuery" value="select username,authority from authorities where username=?"/>
</beans:bean>
userByUsernameQuery传入用户名,返回username,password,enable三个字段,如果字段不匹配或者没有enable字段,可以写成:select name as username,pwd as password,1 from ....。
authoritiesByUsernameQuery传入用户名,返回username和authority两个字段。
二、自定义登录界面
1.删除<http>标签,替换为
<http pattern="/login.jsp" security="none"/>
<http access-denied-page="/access_denied.jsp">
<form-login login-page="/login.jsp"/>
<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/>
<intercept-url pattern="/**" access="ROLE_USER"/>
<session-management>
<concurrency-control max-sessions="1" error-if-maximum-exceeded="false"/>
</session-management>
</http>
设置login.jsp所有人都可以访问
2.新建login.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="j_spring_security_check" method="post">
用户:<input type="text" name="j_username"/><br>
密码:<input type="text" name="j_password"/><br>
<input type="submit">
</form>
</body>
</html>
注意:j_spring_security_check,j_username,j_password都是Spring Security规定好的,不能改变。
三,实现admin和user用户看到的页面不同
这里要使用到Spring Security的标签库,并开启use-expressions。
1.在http标签上添加user-expression="true"属性
<http pattern="/login.jsp" security="none"/>
<http access-denied-page="/access_denied.jsp" use-expressions="true">
<form-login login-page="/login.jsp"/>
<intercept-url pattern="/admin.jsp" access="hasRole('ROLE_ADMIN')"/>
<intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
<session-management>
<concurrency-control max-sessions="1" error-if-maximum-exceeded="false"/>
</session-management>
</http>
所有的access值也要使用内置的表达式hasRole来判断权限(注意括号内还有一对单引号)。
2.修改index.jsp为
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
<html>
<head>
<title>欢迎页面</title>
</head>
<body>
<h2>这是首页,欢迎:<sec:authentication property="name"/></h2>
<sec:authorize access="hasRole('ROLE_ADMIN')">
<a href="admin.jsp">进入admin页面</a>
</sec:authorize>
</body>
</html>
好了,今天就学习到这里吧。请高手多多指点,轻拍。
分享到:
相关推荐
最近自学Spring Security,这里是我做的练习所产生的代码(SSM+Spring Security)包括一些注释等。
db2通用数据库自学教程db2通用数据库自学教程db2通用数据库自学教程db2通用数据库自学教程db2通用数据库自学教程db2通用数据库自学教程db2通用数据库自学教程db2通用数据库自学教程db2通用数据库自学教程db2通用...
Spring_Security-3.0.1_中文自学教程
全国2019年10月高等教育自学考试(04735)数据库系统原理试题及答案,全国2019年10月高等教育自学考试(04735)数据库系统原理试题及答案
学习数据库自学非常好的一本书,适合初学者!让您在一个月内掌握基础的数据库知识!
oracle数据库自学宝典,可以满足想要学习的同学自主学习
sql21自学通 数据库三级技术练习 数据库 练习 非常好用
简明的数据库教程,适合初学者得自学教程,很实用
Spring Security 4.1 电子扫描版,仅供学习使用。
sqlServer数据库自学1.rar 这是我老师上课时后用的ppt 里面他把数据库重要的东西进行了整理,对于初学或自学非常有用,可以少走点弯路,掌握该掌握的。。
基础数据库自学。适合初级。带大纲,源代码
《JavaWeb整合开发完全自学手册》介绍如何整合Struts+Hibernate+Spring+Eclipse进行J2EE开发,所有实例都基于MyEclipseIDE开发,引领读者快速进入基于JavaWeb的J2EE应用领域。《JavaWeb整合开发完全自学手册》主要...
计算机自学视频 汇编 数据库 计算机自学视频 汇编 数据库
2008年1月全国自学考试试题数据库系统原理试卷.doc
自学学习数据库路线规划图
全国自学考试《数据库及其应用》历年试题,包含自考《数据库及其应用》科目2002年-2009年10月的历年试题和答案(部分),欢迎有需要的朋友下载。
数据库系统原理试题,2008年浙江考试试题,自学考试
Spring5自学讲义
自学Spring所产生的代码,包含IOC、AOP的入门以及进阶,Spring与数据库(MySQL)的交互。(该资源不仅包含我写的代码,一切Spring、aspect、jdbc等所需jar包都俱全,项目导入就能跑起来)