`
234390216
  • 浏览: 10192435 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460762
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771696
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395359
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393865
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678192
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529251
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178665
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461733
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150098
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66819
社区版块
存档分类
最新评论

Spring Security(01)——初体验

阅读更多


       首先我们为Spring Security专门建立一个Spring的配置文件,该文件就专门用来作为Spring Security的配置。使用Spring Security我们需要引入Spring SecurityNameSpace

<beans xmlns="http://www.springframework.org/schema/beans"

  xmlns:security="http://www.springframework.org/schema/security"

  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-3.1.xsd

          http://www.springframework.org/schema/security

          http://www.springframework.org/schema/security/spring-security-3.1.xsd">

       

</beans>

 

       Spring Security命名空间的引入可以简化我们的开发,它涵盖了大部分Spring Security常用的功能。它的设计是基于框架内大范围的依赖的,可以被划分为以下几块。

Ø  Web/Http 安全:这是最复杂的部分。通过建立filter和相关的service bean来实现框架的认证机制。当访问受保护的URL时会将用户引入登录界面或者是错误提示界面。

Ø  业务对象或者方法的安全:控制方法访问权限的。

Ø  AuthenticationManager:处理来自于框架其他部分的认证请求。

Ø  AccessDecisionManager:为Web或方法的安全提供访问决策。会注册一个默认的,但是我们也可以通过普通bean注册的方式使用自定义的AccessDecisionManager

Ø  AuthenticationProviderAuthenticationManager是通过它来认证用户的。

Ø  UserDetailsService:跟AuthenticationProvider关系密切,用来获取用户信息的。

 

       引入了Spring SecurityNameSpace之后我们就可以使用该命名空间下的元素来配置Spring Security了。首先我们来定义一个http元素,security只是我们使用命名空间的一个前缀。http元素是用于定义Web相关权限控制的。

   <security:http auto-config="true">

      <security:intercept-url pattern="/**" access="ROLE_USER"/>

   </security:http> 

 

       如上定义中,intercept-url定义了一个权限控制的规则。pattern属性表示我们将对哪些url进行权限控制,其也可以是一个正则表达式,如上的写法表示我们将对所有的URL进行权限控制;access属性表示在请求对应的URL时需要什么权限,默认配置时它应该是一个以逗号分隔的角色列表,请求的用户只需拥有其中的一个角色就能成功访问对应的URL。这里的“ROLE_USER”表示请求的用户应当具有ROLE_USER角色。“ROLE_”前缀是一个提示Spring使用基于角色的检查的标记。

       有了权限控制的规则了后,接下来我们需要定义一个AuthenticationManager用于认证。我们先来看如下定义:

   <security:authentication-manager>

      <security:authentication-provider>

         <security:user-service>

            <security:user name="user" password="user" authorities="ROLE_USER"/>

            <security:user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN"/>

         </security:user-service>

      </security:authentication-provider>

   </security:authentication-manager>

 

       authentication-manager元素指定了一个AuthenticationManager,其需要一个AuthenticationProvider(对应authentication-provider元素)来进行真正的认证,默认情况下authentication-provider对应一个DaoAuthenticationProvider,其需要UserDetailsService(对应user-service元素)来获取用户信息UserDetails(对应user元素)。这里我们只是简单的使用user元素来定义用户,而实际应用中这些信息通常都是需要从数据库等地方获取的,这个将放到后续再讲。我们可以看到通过user元素我们可以指定user对应的用户名、密码和拥有的权限。user-service还支持通过properties文件来指定用户信息,如:

   <security:user-service properties="/WEB-INF/config/users.properties"/>

       其中属性文件应遵循如下格式:

username=password,grantedAuthority[,grantedAuthority][,enabled|disabled]

       所以,对应上面的配置文件,我们的users.properties文件的内容应该如下所示:

#username=password,grantedAuthority[,grantedAuthority][,enabled|disabled]

user=user,ROLE_USER

admin=admin,ROLE_USER,ROLE_ADMIN

 

       至此,我们的Spring Security配置文件的配置就完成了。完整配置文件将如下所示。

<beans xmlns="http://www.springframework.org/schema/beans"

  xmlns:security="http://www.springframework.org/schema/security"

  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-3.1.xsd

          http://www.springframework.org/schema/security

          http://www.springframework.org/schema/security/spring-security-3.1.xsd">

 

   <security:http auto-config="true">

      <security:intercept-url pattern="/**" access="ROLE_USER"/>

   </security:http>    

  

   <security:authentication-manager>

      <security:authentication-provider>

         <security:user-service>

            <security:user name="user" password="user" authorities="ROLE_USER"/>

            <security:user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN"/>

         </security:user-service>

      </security:authentication-provider>

   </security:authentication-manager>

       

</beans>

 

       之后我们告诉Spring加载这个配置文件。通常,我们可以在web.xml文件中通过context-param把它指定为Spring的初始配置文件,也可以在对应Spring的初始配置文件中引入它。这里我们采用前者。

   <context-param>

      <param-name>contextConfigLocation</param-name>

   <param-value>/WEB-INF/config/applicationContext.xml,/WEB-INF/config/spring-security.xml</param-value>

   </context-param>

  

   <listener>

   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

   </listener>

 

       Spring的配置文件是通过对应的ContextLoaderListener来加载和初始化的,上述代码中的applicationContext.xml文件就是对应的Spring的配置文件,如果没有可以不用配置。接下来我们还需要在web.xml中定义一个filter用来拦截需要交给Spring Security处理的请求,需要注意的是该filter一定要定义在其它如SpringMVC等拦截请求之前。这里我们将拦截所有的请求,具体做法如下所示:

   <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>

 

       接下来可以启动我们的应用,然后在浏览器中访问我们的主页。你会看到如下页面。



 

 

       因为我们的spring-security.xml文件中配置好了所有的请求都需要“ROLE_USER”权限,所以当我们在请求主页的时候,Spring Security发现我们还没有登录,Spring会引导我们到登录界面。使用正确的用户名和密码(如上面配置的user/useradmin/admin)登录后,如果符合对应的权限我们就可以访问主页了,否则将出现403(禁止访问)界面。

       可能你会奇怪,我们没有建立上面的登录页面,为什么Spring Security会跳到上面的登录页面呢?这是我们设置httpauto-config=”true”Spring Security自动为我们生成的。

       当指定http元素的auto-config=”true”时,就相当于如下内容的简写。

   <security:http>

      <security:form-login/>

      <security:http-basic/>

      <security:logout/>

   </security:http>

       这些元素负责建立表单登录、基本的认证和登出处理。它们都可以通过指定对应的属性来改变它们的行为。

 

 

(注:本文是基于Spring Security3.1.6所写)

(注:原创文章,转载请注明出处。原文地址:http://elim.iteye.com/blog/2154299

  • 大小: 3.8 KB
17
4
分享到:
评论
14 楼 sunwang810812 2017-05-16  
为楼主点赞
13 楼 mrzhanghao 2017-03-05  
4.o版本中
<security:http auto-config="true">
              <security:intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
       </security:http>需要加上hasRole
12 楼 Xuxiheng 2016-01-10  
hangzhoujava 写道
同时分享一个中文文档 也是超级全面 http://www.mossle.com/docs/auth/html/index.html

非常不错,感谢分享!
11 楼 whlt20090509 2016-01-07  
写得真好!受教了!感谢楼主
10 楼 hangzhoujava 2016-01-04  
同时分享一个中文文档 也是超级全面 http://www.mossle.com/docs/auth/html/index.html
9 楼 hangzhoujava 2016-01-04  
好定西,希望楼主不断更新以后内容
8 楼 234390216 2015-12-10  
gongzhibo0509 写道
感谢楼主分享,希望尽快更新。

前段时间太忙了,一直没有更新。最近好点,会陆续更新。
7 楼 gongzhibo0509 2015-12-01  
感谢楼主分享,希望尽快更新。
6 楼 zi_xiaobang 2015-10-08  
      
5 楼 NO8128 2015-08-21  
讲的很仔细了,很好,  让Spring Security的novice也能看明白
4 楼 bravefc 2015-04-10  
文章写的很好,讲述了springSecurity最基本的用法,很清晰。
3 楼 tyb1222 2014-12-05  
感谢分享!
2 楼 234390216 2014-11-30  
CoderDream 写道
感谢分享,楼主能否贴一个Maven版的项目出来?!

写该系列博客时是有建立一个基于Maven的Spring Security应用进行测试的。但是它不是一个完整的应用,而是使用svn控制的一些零零碎碎的功能验证的这么一个过程,所以对应的项目就不贴出来了。另外如果每篇文章都贴出对应时段的源码应用,我觉得也没有必要,因为核心的内容都已经在博文中提到了。
1 楼 CoderDream 2014-11-30  
感谢分享,楼主能否贴一个Maven版的项目出来?!

相关推荐

Global site tag (gtag.js) - Google Analytics