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