`

spring security 配置文件小结(1)

阅读更多
# 一 、方式一:用户名密码都在配置文件中。  
# <?xml version="1.0" encoding="UTF-8"?>  
# <beans:beans xmlns="http://www.springframework.org/schema/security"  
#     xmlns:beans="http://www.springframework.org/schema/beans"  
#     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
#     xsi:schemaLocation="http://www.springframework.org/schema/beans  
#     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
#     http://www.springframework.org/schema/security  
#     http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">  
#   
#     <http auto-config='true'>  
#         <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />  
#         <intercept-url pattern="/**" access="ROLE_USER" />  
#     </http>  
#   
#     <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>  
#   
# </beans:beans>  
#   
#   
# 二、方式二:运用spring security 提供的默认表结构,authentication部分修改如下:  
#     <authentication-provider>  
#         <jdbc-user-service data-source-ref="dataSource"/>  
#     </authentication-provider>  
#   
#     <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
#         <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/>  
#         <beans:property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/>  
#         <beans:property name="username" value="sa"/>  
#         <beans:property name="password" value=""/>  
#     </beans:bean>  
#       
#       
# 三、方式三:运用原先本地的数据库,authentication修改如下:  
#     <authentication-provider>  
#         <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 u.username,r.name as authority  
#                                              from user u  
#                                              join user_role ur  
#                                                on u.id=ur.user_id  
#                                              join role r  
#                                                on r.id=ur.role_id  
#                                             where u.username=?"/>  
#     </authentication-provider>  
#               
#  注:  
#  users-by-username-query为根据用户名查找用户,系统通过传入的用户名查询当前用户的登录名,密码和是否被禁用这一状态。  
#  authorities-by-username-query为根据用户名查找权限,系统通过传入的用户名查询当前用户已被授予的所有权限。  
#    
# 四、方式四;在方式三的基础上,修改登录页面  
# 在xml中的http标签中添加一个form-login标签。  
#   
# <http auto-config='true'>  
#     <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />[1]  
#     <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />  
#     <intercept-url pattern="/**" access="ROLE_USER" />  
#     <form-login login-page="/login.jsp"[2]  
#                 authentication-failure-url="/login.jsp?error=true"[3]  
#                 default-target-url="/" />[4]  
# </http>  
#           
#    
# 1、让没登陆的用户也可以访问login.jsp。[1]  
#   
# 这是因为配置文件中的“/**”配置,要求用户访问任意一个系统资源时,必须拥有ROLE_USER角色,/login.jsp也不例外,如果我们不为/login.jsp单独配置访问权限,会造成用户连登陆的权限都没有,这是不正确的。  
#    
#  2、login-page表示用户登陆时显示我们自定义的login.jsp。[2]  
#   
# 这时我们访问系统显示的登陆页面将是我们上面创建的login.jsp。  
#    
#  3、authentication-failure-url表示用户登陆失败时,跳转到哪个页面。[3]  
#   
# 当用户输入的登录名和密码不正确时,系统将再次跳转到/login.jsp,并添加一个error=true参数作为登陆失败的标示。  
#    
#    
#  4、default-target-url表示登陆成功时,跳转到哪个页面。[4]  
#    
#  五、方式五:使用数据配置角色可以访问的资源(控制到URL级别)(可以参见工程005)  
# <!--从配置文件上可以看到,Spring Security所需的数据应该是一系列URL网址和访问这些网址所需的权限:  
#   
# <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />  
# <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />  
# <intercept-url pattern="/**" access="ROLE_USER" />  
#               
# SpringSecurity 所做的就是在系统初始化时,将以上XML中的信息转换为特定的数据格式,而框架中其他组件可以利用这些特定格式的数据,用于控制之后的验证操作。现在这些资源信息都保存在数据库中了,从数据库中取出数据,然后让它等同于从xml文件中取出,需要做以下几步。  
# -->  
#  1、实现一个符合该功能的类,主要参看该类中1-5步骤,了解即可。  
#  <!--  
#   
# public class JdbcFilterInvocationDefinitionSourceFactoryBean  
#     extends JdbcDaoSupport implements FactoryBean {  
#     private String resourceQuery;  
#   
#     public boolean isSingleton() {  
#         return true;  
#     }  
#   
#     public Class getObjectType() {  
#         return FilterInvocationDefinitionSource.class;  
#     }  
#     //4、 使用urlMatcher和requestMap创建DefaultFilterInvocationDefinitionSource。  
#     public Object getObject() {  
#         return new DefaultFilterInvocationDefinitionSource(this  
#             .getUrlMatcher(), this.buildRequestMap());  
#     }  
#     //2、这样我们可以执行它的execute()方法获得所有资源信息。并把它封装到map中。  
#    
#     protected Map<String, String> findResources() {  
#         ResourceMapping resourceMapping = new ResourceMapping(getDataSource(),  
#                 resourceQuery);  
#   
#         Map<String, String> resourceMap = new LinkedHashMap<String, String>();  
#   
#         for (Resource resource : (List<Resource>) resourceMapping.execute()) {  
#             String url = resource.getUrl();  
#             String role = resource.getRole();  
#   
#             if (resourceMap.containsKey(url)) {  
#                 String value = resourceMap.get(url);  
#                 resourceMap.put(url, value + "," + role);  
#             } else {  
#                 resourceMap.put(url, role);  
#             }  
#         }  
#   
#         return resourceMap;  
#     }  
#       
#       
# /*    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />  
#     <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />  
#     <intercept-url pattern="/**" access="ROLE_USER" />*/  
#   
#     //3、使用获得的资源信息组装requestMap。再把第二步封装到map中的方法进一步加工,使它等价于“如spring从上面模式的配置文件中读取一样”  
#     protected LinkedHashMap<RequestKey, ConfigAttributeDefinition> buildRequestMap() {  
#         LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = null;  
#         requestMap = new LinkedHashMap<RequestKey, ConfigAttributeDefinition>();  
#   
#         ConfigAttributeEditor editor = new ConfigAttributeEditor();  
#   
#         Map<String, String> resourceMap = this.findResources();  
#   
#         for (Map.Entry<String, String> entry : resourceMap.entrySet()) {  
#             RequestKey key = new RequestKey(entry.getKey(), null);  
#             editor.setAsText(entry.getValue());  
#             requestMap.put(key,  
#                 (ConfigAttributeDefinition) editor.getValue());  
#         }  
#   
#         return requestMap;  
#     }  
#   
#     protected UrlMatcher getUrlMatcher() {  
#         return new AntUrlPathMatcher();  
#     }  
#   
#     public void setResourceQuery(String resourceQuery) {  
#         this.resourceQuery = resourceQuery;  
#     }  
#   
#     private class Resource {  
#         private String url;  
#         private String role;  
#   
#         public Resource(String url, String role) {  
#             this.url = url;  
#             this.role = role;  
#         }  
#   
#         public String getUrl() {  
#             return url;  
#         }  
#   
#         public String getRole() {  
#             return role;  
#         }  
#     }  
#     //1、我们通过定义一个MappingSqlQuery实现数据库操作。  
#     private class ResourceMapping extends MappingSqlQuery {  
#         protected ResourceMapping(DataSource dataSource,  
#             String resourceQuery) {  
#             super(dataSource, resourceQuery);  
#             compile();  
#         }  
#   
#         protected Object mapRow(ResultSet rs, int rownum)  
#             throws SQLException {  
#             String url = rs.getString(1);  
#             String role = rs.getString(2);  
#             Resource resource = new Resource(url, role);  
#   
#             return resource;  
#         }  
#     }  
# }  
#   
#  -->  
#  2、替换原有功能的切入点  
#  在spring中配置我们编写的代码。  
#   
# <beans:bean id="filterInvocationDefinitionSource"  
#     class="com.family168.springsecuritybook.ch005.JdbcFilterInvocationDefinitionSourceFactoryBean">  
#     <beans:property name="dataSource" ref="dataSource"/>  
#     <beans:property name="resourceQuery" value="  
#         select re.res_string,r.name  
#           from role r  
#           join resc_role rr  
#             on r.id=rr.role_id  
#           join resc re  
#             on re.id=rr.resc_id  
#       order by priority  
#     "/>  
# </beans:bean>  
#               
# 下一步使用这个filterInvocationDefinitionSource创建filterSecurityInterceptor,并使用它替换系统原来创建的那个过滤器。  
#   
# <beans:bean id="filterSecurityInterceptor"  
#     class="org.springframework.security.intercept.web.FilterSecurityInterceptor" autowire="byType">  
#     <custom-filter before="FILTER_SECURITY_INTERCEPTOR" />  
#     <beans:property name="objectDefinitionSource" ref="filterInvocationDefinitionSource" />  
# </beans:bean>  
#               
# 注意这个custom-filter标签,它表示将filterSecurityInterceptor放在框架原来的 FILTER_SECURITY_INTERCEPTOR过滤器之前,这样我们的过滤器会先于原来的过滤器执行,因为它的功能与老过滤器完全一样,所以这就等于把原来的过滤器替换掉了。  
#    
#  3、完整的配置文件如下所示:  
#   
# <?xml version="1.0" encoding="UTF-8"?>  
# <beans:beans xmlns="http://www.springframework.org/schema/security"  
#     xmlns:beans="http://www.springframework.org/schema/beans"  
#     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
#     xsi:schemaLocation="http://www.springframework.org/schema/beans  
#     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
#     http://www.springframework.org/schema/security  
#     http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">  
#   
#     <http auto-config="true"/>  
#   
#     <authentication-provider>  
#         <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 u.username,r.name as authority  
#                                              from user u  
#                                              join user_role ur  
#                                                on u.id=ur.user_id  
#                                              join role r  
#                                                on r.id=ur.role_id  
#                                             where u.username=?"/>  
#     </authentication-provider>  
#   
#     <beans:bean id="filterSecurityInterceptor"  
#         class="org.springframework.security.intercept.web.FilterSecurityInterceptor" autowire="byType">  
#         <custom-filter before="FILTER_SECURITY_INTERCEPTOR" />  
#         <beans:property name="objectDefinitionSource" ref="filterInvocationDefinitionSource" />  
#     </beans:bean>  
#   
#     <beans:bean id="filterInvocationDefinitionSource"  
#         class="com.family168.springsecuritybook.ch05.JdbcFilterInvocationDefinitionSourceFactoryBean">  
#         <beans:property name="dataSource" ref="dataSource"/>  
#         <beans:property name="resourceQuery" value="  
#             select re.res_string,r.name  
#               from role r  
#               join resc_role rr  
#                 on r.id=rr.role_id  
#               join resc re  
#                 on re.id=rr.resc_id  
#           order by priority  
#         "/>  
#     </beans:bean>  
#   
#     <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
#         <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/>  
#         <beans:property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/>  
#         <beans:property name="username" value="sa"/>  
#         <beans:property name="password" value=""/>  
#     </beans:bean>  
# </beans:beans>  
#   
#   
#  4、允许动态增加某个用户权限。  
#  目前存在的问题是,系统会在初始化时一次将所有资源加载到内存中,即使在数据库中修改了资源信息,系统也不会再次去从数据库中读取资源信息。这就造成了每次修改完数据库后,都需要重启系统才能时资源配置生效。  
#   
# 解决方案是,如果数据库中的资源出现的变化,需要刷新内存中已加载的资源信息时,使用下面代码:  
#   
# <%@page import="org.springframework.context.ApplicationContext"%>  
# <%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>  
# <%@page import="org.springframework.beans.factory.FactoryBean"%>  
# <%@page import="org.springframework.security.intercept.web.FilterSecurityInterceptor"%>  
# <%@page import="org.springframework.security.intercept.web.FilterInvocationDefinitionSource"%>  
# <%  
#     ApplicationContext ctx =  WebApplicationContextUtils.getWebApplicationContext(application);  
#     FactoryBean factoryBean = (FactoryBean) ctx.getBean("&filterInvocationDefinitionSource");  
#     FilterInvocationDefinitionSource fids = (FilterInvocationDefinitionSource) factoryBean.getObject();  
#     FilterSecurityInterceptor filter = (FilterSecurityInterceptor) ctx.getBean("filterSecurityInterceptor");  
#     filter.setObjectDefinitionSource(fids);  
# %>  
# <jsp:forward page="/"/>  
 

 

分享到:
评论

相关推荐

    spring security 配置文件小结(逐步深化到url级别)

    在本文中,我们将深入探讨Spring Security的配置文件小结,逐步深化到URL级别的保护。 首先,我们需要理解Spring Security的核心组件。这些包括`WebSecurityConfigurerAdapter`,这是自定义安全配置的主要入口点;`...

    spring security 优秀中文资料+例子(包含多个中文资料,很全)

    "spring security 配置文件小结(1) - - JavaEye技术网站.mht" 另一份资源可能总结了Spring Security配置文件的关键元素,这对于初学者理解框架的工作机制非常有帮助。配置文件通常包括`applicationContext-security....

    Spring Security3 中文版 张卫滨 推荐

    - **添加Spring Security XML配置文件的应用到web.xml**:进一步说明如何整合Spring Security配置与应用的主要配置文件。 - **注意这些不足之处**:列举了一些常见的配置错误或陷阱,帮助开发者避免这些坑。 - **...

    spring security3中文文档

    - **添加Spring Security XML配置文件的应用到web.xml**:进一步指导如何整合Spring Security配置。 - **注意这些不足之处**:列举可能遇到的问题并提供解决方案。 - **常见问题**:针对开发者可能遇到的典型问题给...

    Spring security实现记住我下次自动登录功能过程详解

    首先,在 Spring Security 的配置文件中,我们需要增加一个 remember-me 配置: ```xml &lt;security:http auto-config="true" use-expressions="false"&gt; &lt;!-- 配置链接地址,表示任意路径都需要 ROLE_USER 权限 --&gt; ...

    SpringSecurity与shiro的使用

    Spring Security与Shiro的使用 Spring Security和Shiro都...小结 Shiro是一个功能强大且灵活的安全框架,提供了许可、认证、加密和会话管理功能。通过自定义Realm,我们可以实现自己的认证逻辑,满足不同的业务需求。

    Spring攻略PDF版

     1.5 使用配置文件配置容器   1.5.1 问题描述   1.5.2 解决方案   1.5.3 实现方法   1.6 小结   第2章 Spring简介   2.1 Spring Framework   2.1.1 Spring的模块介绍   2.1.2 ...

    Spring攻略中文版PDF

     1.5 使用配置文件配置容器   1.5.1 问题描述   1.5.2 解决方案   1.5.3 实现方法   1.6 小结   第2章 Spring简介   2.1 Spring Framework   2.1.1 Spring的模块介绍   2.1.2 ...

    Spring攻略英文版(附带源码)

     1.5 使用配置文件配置容器   1.5.1 问题描述   1.5.2 解决方案   1.5.3 实现方法   1.6 小结   第2章 Spring简介   2.1 Spring Framework   2.1.1 Spring的模块介绍   2.1.2 Spring的...

    Spring攻略(第二版 中文高清版).part1

    第5章 Spring Security 164 5.1 加强URL访问安全 165 5.1.1 问题 165 5.1.2 解决方案 165 5.1.3 工作原理 166 5.2 登录到Web应用 175 5.2.1 问题 175 5.2.2 解决方案 175 5.2.3 工作原理 175 5.3...

    Spring in Action(第二版 中文高清版).part2

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP ...B.4 小结

    spring boot 全面的样例代码

    - [Spring Boot Actuator监控端点小结](http://blog.didispace.com/spring-boot-actuator-1/) - [在传统Spring应用中使用spring-boot-actuator模块提供监控端点]...

    Spring in Action(第二版 中文高清版).part1

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP ...B.4 小结

    Spring攻略(第二版 中文高清版).part2

    第5章 Spring Security 164 5.1 加强URL访问安全 165 5.1.1 问题 165 5.1.2 解决方案 165 5.1.3 工作原理 166 5.2 登录到Web应用 175 5.2.1 问题 175 5.2.2 解决方案 175 5.2.3 工作原理 175 5.3...

    Spring in Action(第2版)中文版

    目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 ...1.5小结 ...2.6小结 ...3.5.3配置属性的外在化 ...3.7小结 ...4.6小结 ...5.2配置数据源 ...5.6.1配置ibatis客户模板 ...b.4小结

    Spring Boot in Action-chapter 2 sample

    #### 三、小结 通过本章的学习,我们了解了Spring Boot的核心优势——简化依赖管理和自动化配置。掌握了如何利用Spring Boot Starters快速搭建项目基础框架以及如何利用Spring Boot的自动配置机制减少重复性的工作...

Global site tag (gtag.js) - Google Analytics