本篇爲SpringSecurity的第一篇,主要來介紹下什麼是SpringSecurity,以及在springboot中如何使用它java
<!-- more -->git
官方文檔: https://docs.spring.io/spring-security/site/docs/5.2.2.BUILD-SNAPSHOT/reference/htmlsingle/#community-helpgithub
下面是官方介紹web
Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.spring
Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements安全
用國語,簡單抽象的說一下它的定義springboot
那麼具體能幹嗎?cookie
接下來咱們看一下再springboot中如何使用springsecurityapp
首先得是spring boot項目,而後添加上security的依賴便可,相對完整的pom配置以下(注意咱們使用的springboot版本爲2.2.1.RELEASE)
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </pluginManagement> </build> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/libs-snapshot-local</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone-local</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>spring-releases</id> <name>Spring Releases</name> <url>https://repo.spring.io/libs-release-local</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
上面配置完以後,啥都不須要幹,項目已經接入了spring security;項目中的服務都須要登陸以後才能訪問
// 程序啓動類 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } // rest 服務 @RestController public class IndexRest { @GetMapping(path = {"/", "/index"}) public String index() { return "hello this is index!"; } @GetMapping(path = "hello") public String hello(String name) { return "welcome " + name; } }
當咱們須要訪問首頁時,會發現直接302重定向到登陸頁面了,以下圖
spring security默認給咱們生成了一個用戶名爲user,密碼爲控制檯中輸出的一行日誌如Using generated security password: aa410186-5c04-4282-b217-507ffb1f61eb
登陸以後會重定向回咱們以前訪問的url,經過抓包能夠看到,登陸成功以後,會設置請求方的cookie,後續的請求攜帶cookie來代表用戶身份
上面雖然演示了一個hello world的初體驗項目,可是這個默認的用戶名/密碼有點鬼畜,默認的配置主要來自於org.springframework.boot.autoconfigure.security.SecurityProperties.User
,下面是截圖(因此前面的用戶名爲user)
接下來咱們須要配置爲對人類友好的方式,在項目的配置文件application.yml
中,指定登陸的用戶名/密碼
spring: security: user: name: yihuihui password: 123456
重啓測試項目,使用新的用戶名/密碼(yihuihui/123456)就能夠登陸成功了;
上面雖然是一個簡單的case,但還有一點不得不提一下,在個人接口中,雖然知道你登陸了,但怎麼知道你是誰呢?
咱們能夠直接經過HttpServletRequest#getRemoteUser()
的方法來獲取登陸用戶; 或者經過SecurityContextHolder.getContext().getAuthentication().getPrincipal()
來獲取受權信息
咱們來寫一個通用方法
public String getUser() { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getRemoteUser(); } // or public Object getUser() { SecurityContextHolder.getContext().getAuthentication().getPrincipal(); }
而後稍微改一下咱們的服務接口
@GetMapping(path = {"/", "/index"}) public String index() { return "hello this is index! welcome " + getUser(); }
再次訪問以後,結果以下
本文主要是spring security系列的起源篇,第一節介紹了下什麼是SpringSecurity,有什麼特色
第二節介紹了一個簡單入門的HelloWorld實例
spring-boot-starter-security
; 全部的http接口訪問都須要登陸,默認提供一個用戶名爲user,密碼爲控制檯輸出的UUID字符串spring.security.user.name
和spring.security.user.password
來指定用戶名密碼HttpServletRequest#getRemoteUser()
獲取登陸用戶那麼問題來了,什麼系統可能只有一個用戶呢?要多用戶怎麼辦?不一樣的用戶不一樣的權限怎麼辦?某些接口全部人均可以訪問又怎麼辦?
盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
下面一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛