博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring源码剖析之Spring Security安全框架
阅读量:6835 次
发布时间:2019-06-26

本文共 3582 字,大约阅读时间需要 11 分钟。

hot3.png

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。本站素文宅www.yoodb.com为大家分析一下Spring Security安全框架,仅供大家参考学习。

安全框架Spring Security具体可以分为如下Jar包:

spring-security-acl-3.1.4.RELEASE.jarspring-security-aspects-3.1.4.RELEASE.jarspring-security-cas-3.1.4.RELEASE.jarspring-security-config-3.1.4.RELEASE.jarspring-security-core-3.1.4.RELEASE.jarspring-security-crypto-3.1.4.RELEASE.jarspring-security-ldap-3.1.4.RELEASE.jarspring-security-openid-3.1.4.RELEASE.jarspring-security-remoting-3.1.4.RELEASE.jarspring-security-taglibs-3.1.4.RELEASE.jarspring-security-web-3.1.4.RELEASE.jar

使用Spring Security需要引入Spring Security的NameSpace命名空间,具体xml信息如下:

Spring Security命名空间的引入可以简化我们的开发,它涵盖了大部分Spring Security常用的功能。它的设计是基于框架内大范围的依赖的,可以被划分为以下几块。 Web/Http 安全:这是最复杂的部分。通过建立filter和相关的service bean来实现框架的认证机制。当访问受保护的URL时会将用户引入登录界面或者是错误提示界面。 业务对象或者方法的安全:控制方法访问权限的。 AuthenticationManager:处理来自于框架其他部分的认证请求。 AccessDecisionManager:为Web或方法的安全提供访问决策。会注册一个默认的,但是我们也可以通过普通bean注册的方式使用自定义的AccessDecisionManager。 AuthenticationProvider:AuthenticationManager是通过它来认证用户的。 UserDetailsService:跟AuthenticationProvider关系密切,用来获取用户信息的。

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

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

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_USERadmin=admin,ROLE_USER,ROLE_ADMIN

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

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

contextConfigLocation
/WEB-INF/config/applicationContext.xml,/WEB-INF/config/spring-security.xml
org.springframework.web.context.ContextLoaderListener

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

springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*

转载于:https://my.oschina.net/freelife/blog/780459

你可能感兴趣的文章
电讯盈科企业方案公司成立全球数据中心联盟
查看>>
美国情报部门表示可通过物联网监控公民
查看>>
2016年俄罗斯M2M市场达100亿俄罗斯卢布
查看>>
AI民主化:你愿意与Cortana共享绝密隐私吗?
查看>>
零售连锁企业CRM可以实现什么?
查看>>
说说CORS与jsonp
查看>>
Vue组件间通信
查看>>
webpack笔记
查看>>
最最最常用的十大ES6特性总结
查看>>
leetcode.最小栈问题
查看>>
js实现可执行的字符串计算
查看>>
IPFS基本使用
查看>>
玩转Go语言之闭包
查看>>
iOS 控制器的实例 的block循环引用
查看>>
用委托者模式实现的多类型Adapter
查看>>
大数据技术于应用 可视化图表的开发应用
查看>>
说说MySQL索引相关
查看>>
小猿圈Java学习之程序员需要注意的5项守则
查看>>
CentOS 6.5安装Redis-2.8.23
查看>>
Django模板和变量的使用
查看>>