摘要:導讀在上一篇文章中對集成做了一個簡單的介紹,這篇文章中主要圍繞集成展開文章末尾附有學習資料。當我們使用元素來定義一個時,如果沒有指定對應關聯的對象,默認會使用。在進行認證的時候需要一個來獲取用戶的信息,其中包括用戶名密碼和所擁有的權限等。
導讀
在上一篇文章中對Spring Boot 集成Shrio做了一個簡單的介紹,這篇文章中主要圍繞Spring Boot 集成 Spring Security展開,文章末尾附有學習資料。
快速上手: 1.引入pom依賴2.實現一個簡單的用戶權限類org.springframework.boot spring-boot-starter-security
用戶權限功能的設計不是本篇文章的重點,這里以一個簡單的例子作為演示,需要創建兩個實體類一個枚舉類
用戶類:
@JsonIgnoreProperties(value = { "hibernateLazyInitializer","password" ,"new"}) @DynamicUpdate @Entity public class User extends AbstractPersistable{ private static final long serialVersionUID = 2080627010755280022L; private String userName; @Column(unique = true, updatable = false) private String loginName; private String password; @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set roles; /**省略get/set**/ }
角色類別:
public enum RoleType { //級別從高到低 ADMIN->USER ADMIN,//管理員 USER//普通用戶 }
角色類:
@Entity public class Role extends AbstractPersistable3.定制自己的配置{ private static final long serialVersionUID = -856234002396786101L; @Enumerated(EnumType.STRING) @Column(name = "role_name", unique = true) private RoleType roleType; }
首先需要從數據庫中查詢出來用戶數據交給Spring Security這里有兩種主要的方式:
AuthenticationProvider&&UserDetailsService兩種方式的介紹:
Spring Security認證是由 AuthenticationManager 來管理的,但是真正進行認證的是 AuthenticationManager 中定義的 AuthenticationProvider。AuthenticationManager 中可以定義有多個 AuthenticationProvider。當我們使用 authentication-provider 元素來定義一個 AuthenticationProvider 時,如果沒有指定對應關聯的 AuthenticationProvider 對象,Spring Security 默認會使用 DaoAuthenticationProvider。DaoAuthenticationProvider 在進行認證的時候需要一個 UserDetailsService 來獲取用戶的信息 UserDetails,其中包括用戶名、密碼和所擁有的權限等。所以如果我們需要改變認證的方式,我們可以實現自己的 AuthenticationProvider;如果需要改變認證的用戶信息來源,我們可以實現 UserDetailsService。
a.實現UserDetailsService 接口public class CustomUserDetailsService implements UserDetailsService { @Autowired UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByLoginName(username); if(user == null){ throw new UsernameNotFoundException("not found"); } Listauthorities = new ArrayList<>(); authorities.add(new SimpleGrantedAuthority(user.getRole().name())); System.err.println("username is " + username + ", " + user.getRole().name()); return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities); } }
將自己的配置托管給Sprng 管理,Security為我們提供了WebSecurityConfigurerAdapter 我們只需要根據自己的需要進行繼承重寫即可
@Configuration @EnableWebMvcSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override @Bean public UserDetailsService userDetailsService() { return new CustomUserDetailsService(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/index").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .defaultSuccessUrl("/admin") .permitAll() .and() .logout() .permitAll(); } }b.實現 AuthenticationProvider接口
@Component public class CustomAuthenticationProvider implements AuthenticationProvider { private static final Logger logger = LoggerFactory.getLogger(CustomAuthenticationProvider.class); @Autowired private UserRepository userRepository; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String loginName = authentication.getName(); String password = authentication.getCredentials().toString(); ListgrantedAuths = new ArrayList<>(); if (vaildateUser(loginName, password, grantedAuths)) { Authentication auth = new UsernamePasswordAuthenticationToken(loginName, password, grantedAuths); return auth; } else { return null; } } public boolean vaildateUser(String loginName, String password, List grantedAuths) { User user = userRepository.findByLoginName(loginName); if (user == null || loginName == null || password == null) { return false; } if (user.getPassword().equals(SHA.getResult(password)) && user.getUserStatus().equals(UserStatus.NORMAL)) { Set roles = user.getRoles(); if (roles.isEmpty()) { grantedAuths.add(new SimpleGrantedAuthority(RoleType.USER.name())); } for (Role role : roles) { grantedAuths.add(new SimpleGrantedAuthority(role.getRoleType().name())); logger.debug("username is " + loginName + ", " + role.getRoleType().name()); } return true; } return false; } @Override public boolean supports(Class> authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } }
將配置托管給Spring
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomAuthenticationProvider customAuthenticationProvider; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(customAuthenticationProvider); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/index").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .defaultSuccessUrl("/admin") .permitAll() .and() .logout() .permitAll(); } }4.添加角色驗證
我們將用戶分成了管理員與普通用戶,用戶頁面對用戶與管理可見,管理員頁面只對管理員可見
@Controller public class UserController { PreAuthorize("hasAnyAuthority("ADMIN","USER")") @GetMapping("/user") public String user(){ return "user"; } @PreAuthorize("hasAnyAuthority("ADMIN")")@ @GetMapping("/admin") public String admin(){ return "admin"; } }
Spring Security雖然要比Apache Shiro功能強大,但作為Spring 自家的應用與Spring 整合確實非常簡單,同樣Spring Security 學習成本要比Apache Shiro高。
結語這篇文章是匆忙中擠時間趕工出來的產物,有些地方也許寫的有些問題,歡迎提出反饋。下篇文章打算用之前所學的技術做一個簡單的項目,正在想做什么,歡迎提出建議。
學習資料:Spring Security 中文參考手冊
Spring Security系列博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66915.html
摘要:下一代服務端開發下一代服務端開發第部門快速開始第章快速開始環境準備,,快速上手實現一個第章企業級服務開發從到語言的缺點發展歷程的缺點為什么是產生的背景解決了哪些問題為什么是的發展歷程容器的配置地獄是什么從到下一代企業級服務開發在移動開發領域 《 Kotlin + Spring Boot : 下一代 Java 服務端開發 》 Kotlin + Spring Boot : 下一代 Java...
摘要:并向注冊中心注冊,注冊地址為,最后將的所有端口暴露出來,配置如下在工程的啟動類加上注解,開啟的功能,加上注解開啟的功能。在啟動類加上注解,開啟的功能。 轉載請標明出處: https://www.fangzhipeng.com本文出自方志朋的博客 Spring Boot Admin簡介 Spring Boot Admin是一個開源社區項目,用于管理和監控SpringBoot應用程序。 ...
摘要:框架具有輕便,開源的優點,所以本譯見構建用戶管理微服務五使用令牌和來實現身份驗證往期譯見系列文章在賬號分享中持續連載,敬請查看在往期譯見系列的文章中,我們已經建立了業務邏輯數據訪問層和前端控制器但是忽略了對身份進行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:如果全部使用默認值的情況話不需要做任何配置方式前提項目需要添加數據源依賴。獲取通過獲取啟用在使用格式化時非常簡單的,配置如下所示開啟轉換轉換時所需加密,默認為恒宇少年于起宇默認不啟用,簽名建議進行更換。 ApiBoot是一款基于SpringBoot1.x,2.x的接口服務集成基礎框架, 內部提供了框架的封裝集成、使用擴展、自動化完成配置,讓接口開發者可以選著性完成開箱即...
摘要:授權框架使第三方應用程序來獲取對服務的有限訪問機會。無論是通過編排資源所有者和服務之間的交互批準的資源所有者,或通過允許第三方應用程序來獲取自己的訪問權限。 SpringCloud打造微服務平臺--概覽 簡述 SpringCloud是什么 Spring Boot和SpringCloud是什么關系 Spring Boot是Spring的一套快速WEB開發的腳手架,可建立獨立的Sprin...
閱讀 3014·2021-11-16 11:42
閱讀 3653·2021-09-08 09:36
閱讀 950·2019-08-30 12:52
閱讀 2481·2019-08-29 14:12
閱讀 769·2019-08-29 13:53
閱讀 3583·2019-08-29 12:16
閱讀 644·2019-08-29 12:12
閱讀 2469·2019-08-29 11:16