日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring security:第一个程序解析

發布時間:2023/12/10 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:第一个程序解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。