spring.security提供了一種身份認證框架,開發者可以在這個框架中實現各種方式的用戶身份管理,比如:LDAP、MYSQL、OAUTH、Mongo等等。
spring.security認證步驟:
1、配置類 WebSecurityConfigurerAdapter
該類中通過configure 各種參數來關聯前端頁面提交的身份信息和后端數據服務提供的身份信息。其中,
1)configure( HttpSecurity http)配置前端,各種頁面的訪問權限和登錄頁、用戶名、密碼的綁定信息
http.authorizeRequests() .antMatchers("/", "/public/**").permitAll() .antMatchers("/users/**").hasAuthority("ADMIN") .anyRequest().fullyAuthenticated() .and() .formLogin() .loginPage("/login") .failureUrl("/login?error") .usernameParameter("email") .permitAll() .and() .logout() .logoutUrl("/logout") .deleteCookies("remember-me") .logoutSuccessUrl("/") .permitAll() .and() .rememberMe();
2)configure(AuthenticationManagerBuilder auth)配置關聯后端的身份數據信息提供源
//DAO模式 @Autowired private UserDetailsService userDetailsService; @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService) .passwordEncoder(new BCryptPasswordEncoder()); }
spring.security在認證過程中調用userDetailsService實例的loadUserByUsername獲取后端對應的身份認證信息,如果找不到則拋出UsernameNotFoundException
異常。
2. Controller中配置API的授權訪問約束
@PreAuthorize("@currentUserServiceImpl.canAccessUser(principal, #id)") @RequestMapping("/user/{id}") public ModelAndView getUserPage(@PathVariable Long id) { ... } @PreAuthorize("hasAuthority('ADMIN')") @RequestMapping(value = "/user/create", method = RequestMethod.GET) public ModelAndView getUserCreatePage() {