首先我們先對Spring Security進行簡單的介紹:
Spring Security是專門針對基于Spring的項目的安全框架,充分利用了aop和依賴注入來實現安全的功能缩搅。安全框架有兩個重要的概念,即認證和授權揍诽。認證即確認用戶可以訪問當前系統瓣颅;授權即確定用戶在當前系統下所擁有的功能權限弧岳。
Spring Security的配置
1)DelegatingFilterProxy
Spring Security為我們提供了一個或多個過濾器來實現所有安全的功能,我們只需注冊一個特殊的DelegatingFilterProxy過濾器到WebApplicationInitializer即可几晤。
而在實際應用中约炎,我們只需要讓自己的Initializer類繼承AbstractSecurityWebApplicationInitializer抽象類即可。AbstractSecurityWebApplicationInitializer實現了WebApplicationInitializer接口蟹瘾,并通過onStartup方法調用圾浅。
insertSpringSecurityFilterChain(servletContext);
它為我們注冊了DelegatingFilterProxy。insertSpringSecurityFilterChain源碼如下:
配置
Spring Security的配置和Spring MVC的配置類似憾朴,只需在一個配置類上注解@EnableWebSecurity,并讓這個類繼承WebSecurityCOnfigurerAdapter即可狸捕。我們可以通過重寫configure方法來配置相關的安全配置。
代碼如下:
用戶認證
認證需要我們有一套用戶數據的來源,而授權則是對于某個用戶有相應的角色權限众雷。
在Spring Security里我們通過重寫Protected void configure(AuthenticationManagerBuilder auth)方法來實現定制灸拍。
1)內存中的用戶
使用AuthenticationManagerBuilder的inMemoryAuthentication方法即可添加在內存中的用戶,并可給用戶指定角色權限。
2)JDBC中的用戶
JDBC中的用戶直接指定dataSource即可砾省。
不過這看上去很奇怪,其實這里的Spring Security是默認了你的數據庫結構的鸡岗。通過jdbcAuthentication的源碼,我們可以看出JdbcDaoImpl中定義默認的用戶及角色權限獲取的SQL語句:
當然我們可以自定義我們的查詢用戶和權限的SQL語句,例如:
3)通用的用戶
上面的兩種用戶和權限的獲取方式只限于內存或者JDBC编兄,我們的數據訪問方式可以是多種多樣的,可以是非關系型數據庫轩性,也可以是我們常用的JPA等。
這時我們需要自定義實現UserDetailsService接口狠鸳。上面的內存中用戶及JDBC用戶就是UserDetailsService的實現揣苏,定義如下:
說明:SysUser是我們系統的用戶領域對象類悯嗓,User來自于org.springframework.Security.core.userdetails.User。除此之外,我們還需要注冊這個CustomUserService,代碼如下:
請求授權:
Spring Security是通過重寫Protected void configure(HttpSecutity http)方法來實現請求攔截的卸察。
Spring Security使用以下匹配器來匹配請求路徑:
antMatchers:使用Ant風格的路徑匹配
regexMatchers:使用正則表達式匹配路徑
anyRequest:匹配所有請求路徑
在匹配了請求路徑后脯厨,需要針對當前用戶的信息對請求路徑進行安全處理,
Spring Security提供了表9-1所示的安全處理方法。
我們可以看一下下面的示例代碼:
代碼解釋:
1)通過authorizeRequests方法來開始請求權限配置坑质。
2)請求匹配/admin/**,只有擁有Role_ADMIN角色的用戶可以訪問合武。
3)請求匹配到/user/**,擁有ROLE_ADMIN或ROLE_USER角色的用戶都可訪問洪乍。
4)其余所有的請求都需要認證后(登陸后)才可訪問。
定制登錄行為
我們也可以通過重寫
Protected void configure(httpSecurity http)
方法來定制我們的登錄行為夜焦。
下面將重用的登錄行為的定制以簡短的代碼演示:
代碼解釋:
1)通過formLogin方法定制登錄操作壳澳。
2)使用loginPage方法定制登錄頁面的訪問地址。
3)defaultSuccessUrl指定登錄成功后轉向的頁面茫经。
4)failureUrl指定登錄失敗后轉向的頁面巷波。
5)rememberMe開啟cookie存儲用戶信息。
6)tokenValiditySeconds指定cookie有效期為1209600秒卸伞,即2個星期
7)key指定cookie中的私鑰抹镊。
8)使用logout方法定制注銷行為。
9)logoutUrl指定注銷的URL路徑
10)logoutSuccessUrl指定注銷成功后轉向的頁面
參考書籍:JavaEE開發(fā)的顛覆者 Spring Boot實戰(zhàn)
下一篇講解spring boot整合Spring Security