spring security:第一个程序解析
上一篇在一個(gè)項(xiàng)目里配置了spring security,這里大致說一些這些配置的作用。
pom.xml 文件解析
<!-- spring security --><!-- spring 安全--><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>4.0.4.RELEASE</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>4.0.4.RELEASE</version></dependency>這里配置了兩個(gè)模塊,web模塊不用說,config模塊的作用是:支持使用命名空間(NameSpace)方式配置spring security。
spring security有兩種配置方式,一種是Namespace,也就是我們現(xiàn)在使用的。在sring-security.xml文件中我們可以看到:
<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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd">這里有個(gè)security命名空間,就是由config模塊提供支持的。
除此之外,spring security有下面幾個(gè)模塊:
| Core | 核心基礎(chǔ)模塊,任何使用spring security 的項(xiàng)目都需要使用這個(gè)模塊 |
| Remoting | 如果你使用Spring Remoting的話,就需要引入這個(gè)模塊,否則不用 |
| Web | 包含很多過濾器,提供web 用戶認(rèn)證服務(wù)和基于URL的訪問控制 |
| Config | 支持spring security命名空間(namespace)配置,如果你使用的是命名空間的配置方式,那就需要引入這個(gè)模塊 |
| LDAP | 支持LDAP認(rèn)證服務(wù) |
| ACL | 支持ACL認(rèn)證服務(wù) |
| CAS | 支持CAS認(rèn)證服務(wù) |
| OpenID | 支持OpenID 認(rèn)證服務(wù) |
對(duì)于各服務(wù)的描述,可查看原文:spring security modules
web.xml 文件解析
<!-- 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><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-security.xml, /WEB-INF/applicationContext.xml</param-value></context-param>上面的代碼1)配置了一個(gè)代理Servlet過濾器 2)指出了spring security的配置文件位置。
spring借助一系列filter來提供各種安全性功能,上面配置的springSecurityFilterChain這個(gè)過濾器就相當(dāng)去一個(gè)入口,它攔截下請(qǐng)求后,拋給spring security定義的各種過濾器去處理。
至于springSecurityFilterChain將請(qǐng)求拋給哪些過濾器,這個(gè)不用我們擔(dān)心,我們只要在下面的spring-security.xml文件中使用<http>標(biāo)簽定義安全規(guī)則,spring security會(huì)自動(dòng)調(diào)用相應(yīng)的過濾器。
這個(gè)filter的名字是spring security內(nèi)部定義的,不能修改。
spring-security.xml
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"> <http><intercept-url pattern="/user/**" access="hasRole('USER')" /><intercept-url pattern="/admin/**" access="hasRole('ADMIN')" /><form-login /><logout /></http><authentication-manager><authentication-provider><user-service><user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /><user name="bob" password="bobspassword" authorities="ROLE_USER" /></user-service></authentication-provider></authentication-manager></beans:beans>在這個(gè)文件里,我們使用了security作為默認(rèn)命名空間,這樣就不用再寫security 前綴了。
文件中只有兩個(gè)標(biāo)簽,<http>標(biāo)簽和<authentication-manager>標(biāo)簽。
1)<http>標(biāo)簽
<http>標(biāo)簽定義http安全規(guī)則,<intercept-url pattern="/user/**" access="hasRole('USER')" /> 規(guī)定攔截所有/user/請(qǐng)求,并規(guī)定只有USER角色的認(rèn)證用戶才可以訪問。
access="hasRole('USER')"這里使用的是SPEL表達(dá)式,spring security擴(kuò)展的表達(dá)式如下:
| hasRole([role]) | 檢查用戶是否屬于某個(gè)角色,是的話返回true |
| hasAnyRole([role1,role2]) | 檢查用戶是否屬于一系列角色中的任意一個(gè),是的話返回true |
| hasAuthority([authority]) | 檢查用戶是否有指定權(quán)限,是的話返回true |
| hasAnyAuthority([authority1,authority2]) | 檢查用戶是否有一系列權(quán)限中的任意一個(gè),是的話返回true |
| principal | 用戶的主要信息對(duì)象,包含用戶的用戶名,ip等等信息 |
| authentication | 用戶認(rèn)證對(duì)象的認(rèn)證信息 |
| permitAll | 相當(dāng)于true |
| denyAll | 相當(dāng)false |
| isAnonymous() | 如果當(dāng)前用戶為匿名用戶,則返回true |
| isRememberMe() | 如果當(dāng)前用戶通過remember me登錄,則返回true |
| isAuthenticated() | 如果當(dāng)前用戶不是匿名用戶,則返回true |
| isFullyAuthenticated() | 如果當(dāng)前用戶不是匿名用戶也不是通過remember me 登錄,則返回true |
| hasPermission(Object target, Object permission) | 檢查當(dāng)前用戶是否有訪問目標(biāo)路徑的權(quán)限,例如:hasPermission(domainObject, 'read') |
| hasPermission(Object targetId, String targetType, Object permission) | 同上,例如:hasPermission(1, ‘com.example.domain.Message’, ‘read’) |
參看:spring security built in
2)<authentication-manager>標(biāo)簽
那USER這個(gè)角色是在哪里定義的呢?<authentication-manager>標(biāo)簽就是用管理認(rèn)證用戶的,在這個(gè)標(biāo)簽內(nèi)部,使用<user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />標(biāo)簽,定義用戶名為jimi的用戶是一個(gè)USER角色和一個(gè)ADMIN角色,ROLE_是spring security默認(rèn)的角色前綴。
<authentication-manager>標(biāo)簽既是用戶認(rèn)證的管理者,可以管理基于內(nèi)存、基于數(shù)據(jù)庫、基于LDAP、OpenID等等認(rèn)證方式,這里使用的就是最簡單的基于內(nèi)存的認(rèn)證方式。
參考文檔:
spring security 4.0.4 reference
總結(jié)
以上是生活随笔為你收集整理的spring security:第一个程序解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 弄懂webpack,只要看这一片就够了(
- 下一篇: C语言程序设计100个经典例子