- 浏览: 887283 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
有没有发现一个问题,我们之前做的所有练习,都没的权限管理这个模块。我们的WEB应用中的同一个帐户可以在多台机器上同时登陆,每一个用户可以操作所有功能模块。这样在以后的应用开发中是结对不可行的!
今天的重点内容就是权限管理,如果使用传统的方式进行权限管理,在实现上多少有点麻烦。我在进行桌面开发时,涉及到的权限管理是向用户表中添加用户具有的权限ID串,每次用户登陆时都拿这个串去查询角色表,并根据用户的角色隐藏相应的功能。那我们在WEB应用中应该如何做呢?方法都一样,但是Spring为我们提供了一个框架专门用于权限管理,用起来比较方便——security!
一、Spring-security
SpringSecurity是SpringFramework的一个子项目,之前也叫做AcegiSecruty。
SpringSecurity能用于保护各种Java应用程序(权限管理框架),但在基于Web的应用程序中使用得最为广泛。
SpringSecurity能以声明的方式来保护Web应用程序的URL访问,只需简单的配置即可实现。
SpringSecurity通过一系列Servlet过滤器为Web应用程序提供了多种安全服务。
SpringSecurity2.x显著简化了配置,使用基于XMLSchema和基于注解的配置。
首先让我们来回想一下,以前老方在讲JavaWEB基础时向大家介绍使用Filter进行权限管理,这是一个十分好的方法。当然他也有说,以后大家学习Spring时,只要简单的配置几下就可以进行权限管理了,十分方便。(注意:过滤器)
Security也正是使用过滤器来实现上面的功能的!能想通吗?让我们一点点往下看。
二、HelloWorld!
我们依然从这个经典的程序开始,其实HelloWorld!程序只是学习者直观简单的进入一门语言或工具。我们的这SecurityHelloWrld程序比较一般的HelloWorld程序内容要多一些。我们需要建立两个页面(index.jsp和admin.jsp),index.jsp用于登陆,admin.jsp只有具有ROLE_ADMIN权限的用户才能查看。
我们先想一下需求:
· 防止一个帐户同时在多个机器上登陆
· 帐户只能根据自己的权限操作相应的功能模块
· 帐户只能在页面上看到具有对应权限的数据内容
1.搭建环境
因为我们使用的是Spring-security,所以需要搭建Spring环境。创建一个动态WEB工程(EclipseJavaEE版)。
1).添加jar包: spring.jar、commons-loggin.jar、spring-security-core-2.0.5.jar。
2).WEB文件:
<!-- 搭建Spring --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<!-- 添加Spring-Security过滤器 --> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
看见没,在这用到过滤器代理了!过滤器名称必须指定为”springSecurityFilterChain“,Spring-secrutiy默认为我们提供了一个过滤器。我们也可以编写一个自己的过滤器,然后将它配置为Spring的Bean,Bean的名称必须为 springSecurityFilterChain。
3).applicationContext.xml文件:
<!-- 配置SpringSecurity的http安全服务 --> <sec:http auto-config="true"> <!-- 只有ROLE_ADMIN或ROLE_USER权限用户才能访问index.jsp --> <sec:intercept-url pattern="/index.jsp" access="ROLE_ADMIN,ROLE_USER"/> <!-- 只有ROLE_ADMIN权限用户才能访问admin.jsp --> <sec:intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/> </sec:http>
<!-- 配置SpringSecutiry的权限信息 --> <sec:authentication-provider> <sec:user-service> <!-- 帐户信息 --> <sec:user password="admin" name="admin" authorities="ROLE_ADMIN"/> <sec:user password="user" name="user" authorities="ROLE_USER"/> </sec:user-service> </sec:authentication-provider>
|
需要为这个spring的配置文件添加:xmlns:sec="http://www.springframework.org/schema/security",具体操作步骤不细说了。
在Spring的配置文件中描述帐户、权限信息,但把这么重要的信息放在这里是不安全的!
2.添加JSP页面
index.jsp,body部分的内容:
<body> <h1>*****INDEX*****</h1> <security:authorize ifAllGranted="ROLE_ADMIN"> <br> <a href="admin.jsp">ADMIN</a> </security:authorize> <br> <a href="logout">LOGOUT</a> </body> |
需要为这个JSP文件导入:<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags"%>。
admin.jsp,body部分的内容:
<body> <h1>*****ADMIN*****</h1> <a href="index.jsp">RETURN</a> </body> |
OK,我们的Spring-securityHelloWorld!程序已经完成了!跑一下,看到这个页面没有?
我们没有为工程添加这们的页面啊!先不管这些,使用我们配置的两个帐户登陆看看功能如何。
3.登出配置
因为我们在页面中添加了登出连接,所以我们添加一个登出配置:
<!-- 配置登出信息 --> <logout logout-url="/logout" logout-success-url="/bye.jsp" invalidate-session="true" /> |
我们添加一个bye.jsp页面,点击logout连接时,就会转到此页面。
4.登陆配置
上面的页面是spring-security自动为我们添加的登陆页面,我们也可以设置自己的登陆页面:
<!-- 配置登陆信息 --> <form-login login-page="/login.jsp" login-processing-url="/login" /> |
login.jsp
<!-- 配置登陆信息 --> <form-login login-page="/login.jsp" login-processing-url="/login" default-target-url="/index.jsp" authentication-failure-url="/loginfail.jsp" always-use-default-target="true"/> |
login-page:登陆页面,这里的login.jsp页面中的表单请求和字段名称必须是spring-security指定的,可以查看spring-security默认为我们提供的页面代码。
login-processing-url:登陆请求处理URL。
default-target-url:登陆成功后,转到的页面。
authentication-failure-url:登陆失败后,转到的页面。
always-use-default-target:一直使用”default-target-url“,这是什么意思?假如我们现在有两个页面可以跳到登陆页面,默认情况下spring-security在登陆成功后会跳转到——跳转登陆页面的页面。如果这个值真,那么登陆成功后会一直跳转到”default-target-url“指定的页面。有些情况下,用户直接进入登陆页面进行登陆,此时登陆成功后会跳转到”default-target-url“指定的页面,如果没有指定这个页面则跳转到index.jsp页面,如果没有index.jsp页面将出错。
问题:
将这么重要的信息放在spring的配置文件中是相当不安全的,Spring-security为们提供了安全的方法,将数据放到数据库中。
三、使用数据库替换配置文件
下面我们就实现将用户的帐户信息存储到数据库中,关于页面的访问权限配置存放到数据库中我们明天再总结。在此我们就不大动干戈去使用Hibernate了,我们使用JDBC。
1.添加JDBC
向Spring添加数据源Bean还记得吗?我们使用的数据源是c3p0。
<context:property-placeholder location="classpath:jdbc.properties" /> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${user}" /> <property name="password" value="${password}" /> <property name="driverClass" value="${driverClass}" /> <property name="jdbcUrl" value="${jdbcUrl}" />
<property name="minPoolSize" value="5" /> <property name="initialPoolSize" value="3" /> <property name="maxPoolSize" value="10" /> <property name="acquireIncrement" value="2" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> <constructor-arg ref="dataSource"/> </bean> |
2.建数据库和数据表
用户表与角色表是什么关系?当前是多对多喽!因此我们需要三个表:
1).user(用户表)
3.从数据库中读取权限信息
我们的数据源、jdbcTemplate和数据库已经建好了,接下来就是让spring-security可以读取到数据库中的信息,根据这些信息判断用户输入的登陆信息是否正确以及用户所具有的权限。
1).要想spring-security可以读取到数据库中的信息,我们必须编写一个实现了UserDetailsService接口的类:
package cn.itcast.cc.spring.security;
import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.security.GrantedAuthority; import org.springframework.security.GrantedAuthorityImpl; import org.springframework.security.userdetails.User; import org.springframework.security.userdetails.UserDetails; import org.springframework.security.userdetails.UserDetailsService; import org.springframework.security.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component;
@Component("userDetailsService") public class UserDetailsServiceImpl implements UserDetailsService {
@Resource private SimpleJdbcTemplate jdbcTemplate = null;
@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { // 根据用户名获取帐户和权限信息 String sql = "SELECT username,password,status,name rname" + " FROM user u,role r,user_role ur" + " WHERE u.id=ur.user_id AND r.id=ur.role_id AND username=?"; // 如果一个用户具有多个权限,连接查询会返回一个List List list = this.jdbcTemplate.queryForList(sql, new Object[] { username });
// 取出帐户和权限信息填充到User中返回 if (list == null || list.size() <= 0) // spring-security定义的异常 throw new UsernameNotFoundException("用户不存在!"); // 如果用户存在 Map<String, Object> map = (Map<String, Object>) list.get(0); // 密码 String password = (String) map.get("password"); // 帐户是否可用 boolean enabled = ((Integer) map.get("status") == 1); // 帐户所具有的权限 GrantedAuthority[] gas = new GrantedAuthority[list.size()]; for (int i = 0; i < gas.length; i++) { Map<String, Object> temp = (Map<String, Object>) list.get(i); gas[i] = new GrantedAuthorityImpl((String) temp.get("rname")); } // spring-security提供的类 User user = new User(username, password, enabled, true, true, true, gas); return user; } } |
一定要记住实现的是UserDetailsService 接口,在spring-security帮助手册中应该有。佟佟今天领着大家看着源码,下着断点,找到了这个接口。
2).将applicationContext.xml文件中的”<!-- 配置SpringSecutiry的权限信息 -->“部分,全部替换为:
<authentication-provider user-service-ref="userDetailsService" /> |
3).运行,跑一个!
Spring-security的实现原理是什么?查看它的源文件,东西似乎还不少。我们简单的想一下,这些功能在Filter中完全可以实现。我们可以在Filter中读取数据库的记录,根据帐户的权限决定是否允许用户继续访问。我们也可以在JSP页面中添加代码,判断用户的权限以显示或隐藏相应的功能。
如果我们手动去实现这样的功能,那还是有些麻烦的。
明天继续Spring-sceurity!
http://www.blogjava.net/changcheng/archive/2010/02/03/311856.html
发表评论
-
spring 2.5 注释驱动的 IoC 功能
2012-06-15 23:35 931概述 注释配置相对于 XML 配置具有很多的优势: 它可 ... -
在Spring BeanFactory容器中管理两种bean
2012-06-08 22:45 3007在Spring BeanFactory容器 ... -
容器背后的秘密
2011-04-28 00:26 905核心提示:4.4 容器背 ... -
spring 监听器 IntrospectorCleanupListener简介
2011-04-27 15:49 1272其中JavaBeans Introspector是一个类,位置 ... -
通过ApplicationContextAware获取bean
2011-04-25 17:30 1653通过ApplicationContextAware获取bean ... -
详解 Spring 3.0 基于 Annotation 的依赖注入实现
2011-03-14 17:18 1086简介: Spring 的依赖配置方式与 Spring 框架的内 ... -
spring+hibernate操控LOB对象
2011-03-12 00:27 970spring为hibernate提供了对LOB对像的支持, ... -
Spring AOP
2011-03-11 10:32 854AOP是Aspect Oriented Programming ... -
Spring AOP配置选项
2011-03-11 08:59 1588Spring实现动态代理配置是有两种配置文件:1、 xml ... -
spring 事务传播属性和隔离级别
2011-02-13 14:53 1065一、Propagation (事务的 ... -
spring学习,实例化bean的方式及Bean的作用域
2010-10-26 10:09 1153今天继续学习Spring,黎老师对Spring中比较重要的部分 ... -
Spring学习 xml配置依赖注入
2010-10-26 09:39 983最近项目中也配了几遍ssh框架了,不过老出问题,还是Sprin ... -
IOC控制反转和DI依赖注入区别
2010-10-12 15:20 1174IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IO ... -
Quartz cron表达式详解
2010-09-27 15:13 946字段 允许 ... -
Spring Bean的作用域
2010-09-27 15:12 935XML代码 <bean id="role ... -
spring配置中调用properties文件
2010-09-27 14:59 1562system.propertiesdatabase.url=j ... -
DataSourceUtils.getConnection()要与其对称方法配合使用
2010-09-15 16:56 1374DataSourceUtils.getConnection() ... -
使用BeanNameAutoProxyCreator实现spring的自动代理
2010-09-06 15:05 1014提到代理,我们可以使用ProxyBeanFactory,并配置 ... -
Spring源代码解析(一):IOC容器
2010-08-17 13:33 806在认真学习Rod.Johnson的三部曲之一:< < ... -
Spring源代码分析之(二):IOC容器在web容器中的启动[转]
2010-08-17 13:32 974以下引用自博客:http://jiwenke-spring.b ...
相关推荐
赠送jar包:spring-security-crypto-5.5.2.jar; 赠送原API文档:spring-security-crypto-5.5.2-javadoc.jar; 赠送源代码:spring-security-crypto-5.5.2-sources.jar; 赠送Maven依赖信息文件:spring-security-...
赠送jar包:spring-security-crypto-5.6.1.jar; 赠送原API文档:spring-security-crypto-5.6.1-javadoc.jar; 赠送源代码:spring-security-crypto-5.6.1-sources.jar; 赠送Maven依赖信息文件:spring-security-...
赠送jar包:spring-security-rsa-1.0.10.RELEASE.jar; 赠送原API文档:spring-security-rsa-1.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-security-rsa-1.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:spring-security-jwt-1.0.10.RELEASE.jar; 赠送原API文档:spring-security-jwt-1.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-security-jwt-1.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:spring-security-oauth2-2.3.5.RELEASE.jar; 赠送原API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-2.3.5.RELEASE-sources.jar; 赠送Maven依赖信息...
赠送jar包:spring-security-core-5.3.9.RELEASE.jar; 赠送原API文档:spring-security-core-5.3.9.RELEASE-javadoc.jar; 赠送源代码:spring-security-core-5.3.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:spring-security-core-5.2.0.RELEASE.jar; 赠送原API文档:spring-security-core-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-security-core-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:spring-security-core-5.5.2.jar; 赠送原API文档:spring-security-core-5.5.2-javadoc.jar; 赠送源代码:spring-security-core-5.5.2-sources.jar; 赠送Maven依赖信息文件:spring-security-core-...
赠送jar包:spring-security-core-5.0.7.RELEASE.jar; 赠送原API文档:spring-security-core-5.0.7.RELEASE-javadoc.jar; 赠送源代码:spring-security-core-5.0.7.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:spring-security-web-5.2.0.RELEASE.jar; 赠送原API文档:spring-security-web-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-security-web-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:spring-security-oauth2-2.3.5.RELEASE.jar; 赠送原API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-2.3.5.RELEASE-sources.jar; 赠送Maven依赖信息...
6. **spring-security-core-3.1.2.RELEASE.jar**:Spring Security的核心模块,包含了安全抽象,如权限表达式,访问决策管理器,以及认证和授权的基础设施。 7. **spring-aop-3.1.2.RELEASE.jar**:Spring的面向切...
赠送jar包:spring-security-web-5.6.1.jar; 赠送原API文档:spring-security-web-5.6.1-javadoc.jar; 赠送源代码:spring-security-web-5.6.1-sources.jar; 赠送Maven依赖信息文件:spring-security-web-5.6.1....
赠送jar包:spring-security-oauth2-autoconfigure-2.1.8.RELEASE.jar; 赠送原API文档:spring-security-oauth2-autoconfigure-2.1.8.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-autoconfigure-...
赠送jar包:spring-security-config-5.0.7.RELEASE.jar; 赠送原API文档:spring-security-config-5.0.7.RELEASE-javadoc.jar; 赠送源代码:spring-security-config-5.0.7.RELEASE-sources.jar; 赠送Maven依赖信息...
赠送jar包:spring-security-core-5.5.2.jar; 赠送原API文档:spring-security-core-5.5.2-javadoc.jar; 赠送源代码:spring-security-core-5.5.2-sources.jar; 赠送Maven依赖信息文件:spring-security-core-...
1. **spring-security-core-2.0.5.RELEASE.jar**:这是Spring Security的核心库,包含了所有基本的安全处理类和接口。这个版本的发布解决了2.0.4版本中的已知问题,并可能包含一些性能优化和新功能。它包括了访问...
赠送jar包:spring-security-core-5.6.1.jar; 赠送原API文档:spring-security-core-5.6.1-javadoc.jar; 赠送源代码:spring-security-core-5.6.1-sources.jar; 赠送Maven依赖信息文件:spring-security-core-...
赠送jar包:spring-security-jwt-1.0.10.RELEASE.jar; 赠送原API文档:spring-security-jwt-1.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-security-jwt-1.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:...
spring-boot-security-saml, Spring Security saml与 Spring Boot的集成 spring-boot-security-saml这个项目在处理 spring-security-saml 和 Spring Boot 之间的平滑集成的同时,在处理内部的配置的gritty和锅炉板的...