上次编写了一个能够运行的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 3.0.1 中文自学教程知识点概览 #### 一、Spring Security 简介 ##### 1.1 Spring Security 是什么? Spring Security 是一款强大的、高度可定制的身份验证与授权框架。它能够帮助开发者保护...
在自学Spring5时,可以先从官方文档入手,理解每个模块的基本概念和用法。然后通过编写简单示例来实践,例如创建一个Spring MVC的Hello World应用,或者使用Spring Boot快速搭建一个Web服务。随着对Spring的理解加深...
依赖注入(DI)是Spring的核心原则之一,它实现了控制反转(IOC),这样对象就不需要自己创建或管理依赖关系,而是通过依赖注入由Spring容器管理。这一部分是Spring框架的基本概念,也是Spring认证考试的重要组成...
博客项目自学教程主要涵盖了SpringBoot、Thymeleaf、PageHelper和SpringSecurity四个核心技术和框架。下面将分别详细解释这些技术及其在项目中的应用。 **SpringBoot** SpringBoot是由Pivotal团队提供的全新框架,...
- JDBC模板:使用Spring的JDBC抽象层,简化数据库操作。 - ORM集成:探讨Spring与Hibernate、MyBatis等ORM框架的整合,实现数据持久化。 5. **第五章:Spring MVC** - MVC架构:理解Model-View-Controller模式,...
6. **Spring Security**:对于涉及到安全性的话题,源代码可能包含Spring Security的配置和认证授权示例。 通过深入研究这些源代码,开发者可以更好地理解Spring框架的工作原理,提升自己的技能,并且能够应用到...
在"Spring5自学项目笔记"中,我们将会深入探讨Spring框架的多个关键特性,包括IoC(Inversion of Control)容器、依赖注入、AOP(Aspect Oriented Programming)以及Spring Boot和Spring MVC等。 1. **Spring IoC...
3. **数据访问**:Spring提供了对各种数据库访问技术的支持,包括JDBC、ORM框架如Hibernate和MyBatis。在这个示例项目中,你将学习到如何使用Spring的JdbcTemplate或者JPA来简化数据访问操作,以及如何配置数据源和...
1. **起步依赖(Starter Dependencies)**:Spring Boot 的核心特性之一就是起步依赖,它允许开发者通过添加特定的Maven或Gradle依赖来快速引入所需的功能模块,如Web、Data JPA、Security等。 2. **自动配置(Auto...
然而,在Web开发领域,"SSH2"可能被误写或者理解为"Spring Security H2",这是一个基于Spring Security框架和H2数据库的组合,用于构建Web应用程序的安全性。描述中提到的"简单的网站"可能意味着这个网站的设计和...
Spring框架是Java开发中最常用的轻量级开源框架之一,它以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)能力而著名。Spring框架提供了一个全面的企业级应用程序...
SpringBoot提供了Spring Security模块,可以实现用户认证和授权,防止未授权访问。 10. **错误处理与日志记录** 项目可能包含了错误处理机制,如自定义异常处理,以及使用Log4j或Logback进行日志记录,方便问题...
本入门自学笔记将带你一步步了解并掌握Spring Boot的核心概念和实践技巧。 ### 01 SpringBoot简介 #### 1.1 Spring Boot 的优势 - **简化的起步**:Spring Boot 提供了起步依赖(starter),可以通过添加相应的Maven...
- 安全控制:Spring Security可以集成到系统中,提供认证(Authentication)和授权(Authorization)功能,确保只有合法用户能够访问特定资源。 - 模板引擎:如FreeMarker或Thymeleaf,用于动态生成HTML页面,减少...
《Spring入门书籍》是一本专为初学者设计的教程,旨在帮助读者快速掌握Spring框架的基础知识,从而在Java开发领域奠定坚实的基础。...无论是自学还是作为课堂教学辅助材料,这都是一本极具价值的Spring学习资源。
系统设计采用分层架构,包括控制器层、服务层、持久层和实体层,通过Spring Data JPA、MyBatis等技术实现数据库操作,并结合Spring Security加强系统安全性。 适合人群:计算机相关专业在校学生、初级Java Web开发...
理解Spring与Hibernate的整合,Spring支持的Web作用域,以及Spring的其他模块(如Spring MVC、Spring Security等)。 10. **EJB 3.0**:J2EE架构基础,EJB的地位和基本理论,了解EJB的分类,包括Session Bean。理解...
6. **第三方库**:SpringBoot项目常常依赖于各种第三方库,如MyBatis或Hibernate进行数据访问,Spring Data JPA简化数据库操作,Spring Security处理认证和授权,Swagger用于API文档化等。理解并熟悉这些库的使用...
《基于Springboot的瑞吉外卖项目详解》 瑞吉外卖项目是基于Spring Boot框架构建的一个实战案例,旨在帮助开发者深入理解和应用Spring Boot技术。...对于想要自学Spring Boot的初学者,这是一个不可多得的实战案例。
标题 "1030demo.rar" 提供的信息表明这是一个与编程相关的压缩文件,可能是某个学习者,昵称为“小白”,在自学Spring Boot时创建的一个项目示例。这个项目可能涉及了用户登录、注册以及人员管理的功能。从描述来看...