本篇教程咱們將介紹spring security的集成,爲易於學習,咱們會盡可能剔除無關部分,用最小的配置集成spring security。當你學會怎麼集成spring security以後,下一篇咱們將集成jwt,在那篇教程中,咱們會進一步介紹spring security,完善配置。在先後端分離的大趨勢下,Java後端都是實現REST接口,因此本篇內容僅針對REST接口,如需瞭解不是接口的狀況,可自行參考相關資料。java
spring security的實現基於servlet過濾器,在每一個請求被spring MVC處理以前,先要通過spring security過濾器,從而實現權限控制。權限控制分兩部分,認證和受權,用戶認證就是指登陸,有些接口要用戶登陸後才能訪問;受權是指根據用戶角色授予不一樣權限,有些接口要具備必定角色的用戶才能訪問,如管理相關的接口只限admin角色訪問。mysql
咱們會建立幾個接口,部分接口須要登陸才能訪問,部分接口徹底放開,驗證spring security是否成功集成。git
打開Eclipse,建立spring boot的spring starter project項目,選擇菜單:File > New > Project ...
,彈出對話框,選擇:Spring Boot > Spring Starter Project
,在配置依賴時,勾選web, security
,如不清楚怎樣建立spring boot項目,參照教程: [spring boot hello world (restful接口)例子]。github
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.qikegu</groupId> <artifactId>springboot-security-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-security-demo</name> <description>Demo project for Spring Boot</description> <properties> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
spring能夠用java配置,也可用xml配置,spring官方推薦用java配置,咱們這裏用java配置。web
添加java配置文件:redis
a. 添加spring security過濾器spring
最簡單的註冊spring security過濾器的方法是給java配置類添加@EnableWebSecurity註解:sql
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter{ // ... }
b. 用哪一種方法加密密碼明文數據庫
用戶密碼保存到數據庫時,通常避免明文而以hash值的方式保存,咱們能夠爲spring security配置用什麼方法加密密碼明文,此處使用官方推薦的BCryptPasswordEncoderapache
@Bean public PasswordEncoder myEncoder() { return new BCryptPasswordEncoder(); }
c. 配置用戶信息加載
用戶認證/登陸時須要加載用戶信息比對用戶名與密碼,通常用戶信息從數據庫加載,此處爲簡便起見,在內存中建立用戶信息,包括用戶名、密碼、用戶角色信息
@Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin").password(myEncoder().encode("12345")).roles("ADMIN") .and() .withUser("user").password(myEncoder().encode("12345")).roles("USER"); }
d. 配置接口權限控制
經過配置HttpSecurity,能夠匹配不一樣的url路徑,爲他們指定不一樣權限,在這裏對於/hello3
接口做了權限限制,必須登陸後才能訪問
@Override protected void configure(HttpSecurity http) throws Exception { http // 基於token,不須要csrf .csrf().disable() // 基於token,不須要session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() // 下面開始設置權限 .authorizeRequests() // 須要登陸 .antMatchers("/hello3").authenticated() // 除上面外的全部請求所有放開 .anyRequest().permitAll(); }
package com.qikegu.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @Configuration @EnableWebSecurity // 添加security過濾器 public class SecurityConfig extends WebSecurityConfigurerAdapter{ // 密碼明文加密方式配置 @Bean public PasswordEncoder myEncoder() { return new BCryptPasswordEncoder(); } // 認證用戶時用戶信息加載配置 @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin").password(myEncoder().encode("12345")).roles("ADMIN") .and() .withUser("user").password(myEncoder().encode("12345")).roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http // 基於token,不須要csrf .csrf().disable() // 基於token,不須要session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() // 下面開始設置權限 .authorizeRequests() // 須要登陸 .antMatchers("/hello3").authenticated() // 除上面外的全部請求所有放開 .anyRequest().permitAll(); } }
添加一個控制類,實現幾個測試接口。
在項目中添加文件
添加幾個接口,文件內容以下
package com.qikegu.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping(value="/hello1", method=RequestMethod.GET) public String hello1() { return "Hello1!"; } @RequestMapping(value="/hello2", method=RequestMethod.GET) public String hello2() { return "Hello2!"; } @RequestMapping(value="/hello3", method=RequestMethod.GET) public String hello3() { return "Hello3!"; } }
咱們實現了3個接口,其中/hello3
被配置爲須要登陸訪問,因此訪問/hello3
時會返回權限受限的錯誤。
Eclipse左側,在項目根目錄上點擊鼠標右鍵彈出菜單,選擇:run as -> spring boot app
運行程序。 打開Postman訪問接口,運行結果以下:
訪問/hello1
接口,不受限
訪問/hello3
接口,受限。後面教程將會介紹登陸訪問接口的過程。
本文介紹了spring boot項目中集成spring security的過程,儘可能以簡單的方式配置security,下一篇教程將更加詳細地介紹spring security以及jwt的集成。