javascript
SpringSecurity的简单使用使用案列说明
SpringSecurity
Spring Security是 Spring提供的安全認證服務的框架。 使用Spring Security可以幫助我們來簡化認證
和授權的過程。官網:https://spring.io/projects/spring-security
認證:識別每一次請求是誰在發起
授權:鑒別某個功能或數據,當前用戶是否有權限訪問
RBAC是什么?
RBAC 是基于角色的訪問控制(Role-Based Access Control )在 RBAC 中,權限與角色相關聯,用戶通過成為適當角色的成員而得到這些角色的權限。這就極大地簡化了權限的管理。這樣管理都是層級相互依賴的,權限賦予給角色,而把角色又賦予用戶,這樣的權限設計很清楚,管理起來很方便。
權限模塊數據模型(表的設計)
授權過程:用戶必須完成認證之后才可以進行授權,首先可以根據用戶查詢其角色,再根據角色查詢對應的菜單,這樣就確定了用戶能夠看到哪些菜單。然后再根據用戶的角色查詢對應的權限,這樣就確定了用戶擁有哪些權限。
要實現最終的權限控制,需要有一套表結構支撐:
用戶表t_user、權限表t_permission、角色表t_role、菜單表t_menu、用戶角色關系表t_user_role、角
色權限關系表t_role_permission、角色菜單關系表t_role_menu。
表之間關系如下圖:
搭建maven項目
pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.fs</groupId><artifactId>Spring-Security-Demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><!-- 集中定義依賴版本號 --><properties><!-- 指定編譯字符集,jdk版本--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies> <!-- 導入springMVC的 依耐--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.0.5.RELEASE</version></dependency><!-- 導入spring-security的依耐--><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><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-taglibs</artifactId><version>5.0.5.RELEASE</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><configuration><!-- 指定端口 --><port>89</port><!-- 請求路徑 --><path>/</path></configuration></plugin></plugins></build> </project>web.xml
注意事項:
DelegatingFilterProxy用于整合第三方框架
整合Spring Security時過濾器的名稱必須為springSecurityFilterChain,
否則會拋出NoSuchBeanDefinitionException異常
在web.xml中主要配置SpringMVC的DispatcherServlet和用于整合第三方框架的
DelegatingFilterProxy,用于整合Spring Security。
spring-security.xml
在spring-security.xml中主要配置Spring Security的攔截規則和認證管理器。
我們真實生產環境還差很遠,還存在如下一些問題:
1、項目中我們將所有的資源(所有請求URL)都保護起來,實際環境下往往有一些資源不需要認證也可以訪問,也就是可以匿名訪問。
2、登錄頁面是由框架生成的,而我們的項目往往會使用自己的登錄頁面。
3、直接將用戶名和密碼配置在了配置文件中,而真實生產環境下的用戶名和密碼往往保存在數據庫中。
4、在配置文件中配置的密碼使用明文,這非常不安全,而真實生產環境下密碼需要進行加密。本章節需要對這些問題進行改進。
配置可匿名訪問的資源
第一步:在項目中創建pages目錄,在pages目錄中創建a.html和b.html
第二步:在spring-security.xml文件中配置,指定哪些資源可以匿名訪問
使用指定的登錄頁面
第一步:提供login.html作為項目的登錄頁面
第二步:修改spring-security.xml文件,指定login.html頁面可以匿名訪問
第三步:修改spring-security.xml文件,加入表單登錄信息的配置
對密碼進行加密
前面我們使用的密碼都是明文的,這是非常不安全的。一般情況下用戶的密碼需要進行加密后再保存到
數據庫中。
常見的密碼加密方式有:
3DES、AES、DES:使用對稱加密算法,可以通過解密來還原出原始密碼
MD5、SHA1:使用單向HASH算法,無法通過計算還原出原始密碼,但是可以建立彩虹表進行查表破
解
bcrypt:將salt隨機并混入最終加密后的密碼,驗證時也無需單獨提供之前的salt,從而無需單獨處理
salt問題
加密后的格式一般為:$2a101010/bTVvqqlH9UiE0ZJZ7N2Me3RIgUCdgMheyTgV0B4cMCSokPa.6oCa
實現方法:在spring-security.xml文件中指定密碼加密對象
配置多種校驗規則
為了測試方便,首先在項目中創建a.html、b.html、c.html幾個頁面
修改spring-security.xml文件:
注解方式權限控制:使用場景多
提供的注解方式進行控制。
實現步驟:
第一步:在spring-security.xml文件中配置組件掃描,用于掃描Controller
第二步:在spring-security.xml文件中開啟權限注解支持
第三步:創建Controller類并在Controller的方法上加入注解進行權限控制
退出登錄
用戶完成登錄后Spring Security框架會記錄當前用戶認證狀態為已認證狀態,即表示用戶登錄成功了。
那用戶如何退出登錄呢?我們可以在spring-security.xml文件中進行配置:
通過配置可以發現,如果用戶要退出登錄,只需要請求/logout.do這個URL地址就可以,同時會
將當前session失效,最后頁面會跳轉到login.html頁面。
UserService
從數據庫查詢用戶信息(案列就使用集合模擬數據庫中角色權限數據)
如果我們要從數據庫動態查詢用戶信息,就必須按照spring security框架的要求提供一個實現
UserDetailsService接口的實現類,并按照框架的要求進行配置即可。框架會自動調用實現類中的方法
并自動進行密碼校驗。
我們提供了UserService實現類,并且按照框架的要求實現了UserDetailsService接口。在spring
配置文件中注冊UserService,指定其作為認證過程中根據用戶名查詢用戶信息的處理類。當我們進行
登錄操作時,spring security框架會調用UserService的loadUserByUsername方法查詢用戶信息,并
根據此方法中提供的密碼和用戶頁面輸入的密碼進行比對來實現認證操作。
Member實體會員類
package com.fs.pojo; /* 會員賬號密碼*/ public class Member {private String username;private String password;getset方法 }HelloController(注解對方法實現權限控制)
package com.fs.controller;import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/hello")//要在配置文件中配置這個路徑能被某個角色或者權限控制,否則403,<security:intercept-url pattern="/**" access="hasRole('ROLE_XIAOFU')"/> //@PreAuthorize("hasRole('ROLE_ROOT')")//表示這個類上中的方法只能ROLE_ROOT這個角色訪問 public class HelloController {@RequestMapping("/add")@PreAuthorize("hasAnyAuthority('add')")//表示訪問這個方法需要add權限才能調用這個方法public String add(){System.out.println("add...");return "add...ok";}@RequestMapping("/find")@PreAuthorize("hasAnyAuthority('find')")//表示訪問這個方法需要find權限才能調用這個方法public String find(){System.out.println("find...");return "find...ok";}@RequestMapping("/findOrAdd")@PreAuthorize("hasAnyAuthority('find','add')")//表示訪問這個方法需要add或者find權限才能調用這個方法public String findOrAdd(){System.out.println("findOrAdd...");return "findOrAdd...ok";}@RequestMapping("/role")@PreAuthorize("hasRole('ROLE_ROOT')")//表示訪問這個方法需要ROLE_ROOT這個角色才能訪問public String role(){System.out.println("role...");return "role...ok";} }login.html,index.html,a.html,b.html,c.html
login.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>登錄頁面</title> </head> <body> <form action="/login.do" method="post">用戶名:<input type="text" name="username"><br>密碼:<input type="password" name="password"><br><input type="submit" value="登錄"> </form> </body> </html>index.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> HelloWorld </body> </html>a.html,b.html,c.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> a.html </body> </html>測試
啟動tomcat發現,直接訪問任意頁面,都會跳轉到login.html,然后登錄(在UserService中使用list集合寫死了登錄用戶名的)后,就能根據這個用戶的角色權限去訪問sping-security配置文件中配置的權限對應的頁面或者@PreAuthorize注解對應的方法路徑
總結
以上是生活随笔為你收集整理的SpringSecurity的简单使用使用案列说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring整合定时任务组件Quartz
- 下一篇: 使用Freemarker来页面静态化,与