1.對應的maven坐標:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
2.配置web.xml
<!--
DelegatingFilterProxy用于整合第三方框架
整合Spring Security時過濾器的名稱必須為springSecurityFilterChain,
否則會拋出NoSuchBeanDefinitionException例外
-->
<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>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加載的組態檔 ,通過引數contextConfigLocation加載 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3.配置spring-security.xml
<!--
http:用于定義相關權限控制
指定哪些資源不需要進行權限校驗,可以使用通配符
-->
<security:http security="none" pattern="/js/**"/>
<security:http security="none" pattern="/css/**"/>
<security:http security="none" pattern="/img/**"/>
<security:http security="none" pattern="/plugins/**"/>
<!--http:用于定義相關權限控制,auto-config:是否自動配置
設定為true時框架會提供默認的一些配置,例如提供默認的登錄頁面、登出處理等
設定為false時需要顯示提供登錄表單配置,否則會報錯
use-expressions:用于指定intercept-url中的access屬性是否使用運算式
-->
<security:http auto-config="true" use-expressions="true">
<!--
intercept-url:定義一個攔截規則
pattern:對哪些url進行權限控制
access:在請求對應的URL時需要什么權限,默認配置時它應該是一個以逗號分隔的角色串列,
請求的用戶只需擁有其中的一個角色就能成功訪問對應的URL
-->
<!-- 當登錄的用戶具有ROLE_ADMIN的角色的時候可以訪問所有的頁面 -->
<security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />
<security:logout logout-url="/logout.do"
logout-success-url="/login.html" invalidate-session="true"/>
<!--
csrf:對應CsrfFilter過濾器
disabled:是否啟用CsrfFilter過濾器,如果使用自定義登錄頁面需要關閉此項,
否則登錄操作會被禁用(403)
-->
<security:csrf disabled="true"></security:csrf>
<!--form-login:定義表單登錄資訊-->
<security:form-login login-page="/login.html"
username-parameter="username"
password-parameter="password"
login-processing-url="/login.do"
default-target-url="/pages/main.html"
always-use-default-target="true"
authentication-failure-url="/login.html"
/>
</security:http>
<!--
authentication-manager:認證管理器,用于處理認證操作
-->
<security:authentication-manager>
<!--
authentication-provider:認證提供者,執行具體的認證邏輯
-->
<security:authentication-provider>
<!-- 第一種: -->
<!--
user-service:用于獲取用戶資訊,提供給authentication-provider進行認證(資料是寫死的,僅僅適合用于測驗demo)
-->
<security:user-service>
<!--
user:定義用戶資訊,可以指定用戶名、密碼、角色,后期可以改為從資料庫查詢用戶資訊
{noop}:表示當前使用的密碼為明文
-->
<security:user name="admin"
password="{noop}admin"
authorities="ROLE_ADMIN">
</security:user>
</security:user-service>
<!-- 第二種:springSecurityUserService為自定義的實作UserDetailsService介面的類 -->
<security:authentication-provider user-service-ref="springSecurityUserService">
<!--指定密碼加密策略-->
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
<!--配置密碼加密物件-->
<bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<!--開啟注解方式權限控制-->
<security:global-method-security pre-post-annotations="enabled"/>
4.自定義一個類實作springsecurity框架的介面UserDetailsService,實作里面的抽象方法loadUserByUsername
在方法里面獲取到username的密碼以及相應的權限集合,
創建一個集合用于存盤權限和角色
List<GrantedAuthority> authorityList = new ArrayList<>();
authorityList.add(new SimpleGrantedAuthority(“***”);
//創建并初始化一個userDetails物件,回傳給security
UserDetails userDetails = new org.springframework.security.core.userdetails.User(username, user.getPassword(), authorityList);
return userDetails;
5.注意事項
組態檔和注解同時使用:(兩個都有的時候才會執行該方法,先要有大條件/**,然后在看是否還有其他的權限限制)
<security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/>
……
@PreAuthorize("hasAuthority('edit')")
配置的這些頁面的權限優先級都比(/**)高,優先對這些進行判斷,滿足即會訪問相應的頁面:
```
<security:intercept-url pattern="/index.html" access="isAuthenticated()"/>
<security:intercept-url pattern="/pages/a.html" access="isAuthenticated()"/>
<!--擁有add權限就可以訪問b.html頁面-->
<security:intercept-url pattern="/pages/b.html" access="hasAuthority('add')"/>
<!--擁有ROLE_ADMIN角色就可以訪問c.html頁面-->
<security:intercept-url pattern="/pages/c.html" access="hasRole('ROLE_ADMIN')"/>
```
用組態檔代替注解,就不要兩個權限或者角色都存在,配置的優先級要高于(/**)。
<security:intercept-url pattern="/edit.do" access="hasAuthority('edit')"/>
……
<security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/>
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/100746.html
標籤:Web 開發
下一篇:我才這個問題大家都沒遇到過
