日期:2014-05-16 浏览次数:20466 次
??? 上次编写了一个能够运行的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"/> &