spring security 认证管理器,访问决策管理器,运行身份管理器 basic认证:用户名密码认证,密码明文,用户名密码会用base64加密传输,无状态的,不安全 digest认证:当访问特定资源,对数据md5运算,发送给服务器,根据报文头部获取username,查询获取密码md5进行比较。 x.509:x509的版本号,证书持有人的公钥,证书的序列号(ca给与的唯一编号) ldap:轻量级访问协议。 Form:表单认证。 过滤器: SecurityContextPersistenceFilter 过滤session中是否存在SecurityContext,存在就放入SecurityContextHolder中。 不存在就创建一个放入。 所有过滤器完成后清除SecurityContextHolder中的内容[基于threadlocal必须清空] LogoutFilter:只处理注销请求,在用户发送注销,销毁 session,清空SecurityContextHolder,重定向推出页面 AbstractAuthenticationProcessingFilter:处理form登录的过滤器,管理登录成功失败啥的 DefaultLoginPageGeneratingFiter:默认登录的页面 BasicAuthenticationFilter:AbstractAuthenticationProcessingFilter类似 SecurityContextHolderAwareRequestFilter:包装用户请求 RememberMeAuthenticationFilter:自动登录功能。 AnonymousAuthenticationFilter:当用户没有登录时,会分配匿名用户。 ExceptionTranslationFilter:处理框架抛出异常。 SessionManagementFilter:防止伪造攻击 FilterSecurityInterceptor:未登录抛出未登录异常,已登录没有访问权限,则抛异常,登录正常就放行。 FilterChainProxy:[一组拦截器] 接口: interface UserDetailsService { UserDetails loadUserByUsername(username); } //任何返回false,就是判定无效 interface UserDetails{ Collection<? extends GrantedAuthority> getAuthorities();//集合权限 str getPassword(); str getUsername(); flag isAccountNonExpired();//账户有没有过期 flag iSAccountNonLocked();//账户没有被锁定 flag isCredentialsNonExpired();//证书没有过期 flag isEnabled();//账户是否有效 } //真正安全控制 interface Authentication{ Collection getAuthorities();//集合权限 Object getCredentials();//获取凭证 Object getDetails();//获取认证一些额外信息 Object getPrincipal();//过去认证的实体 flag isAuthenticated();//是否认证通过 }
基础搭建:https://start.spring.io/
引入web和security框架
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @RequestMapping("/") public String home(){ return "Hello word"; } @RequestMapping("/hello") public String hello(){ return "你好 "; } }
SpringSecurityConfig
package com.example.demo; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableWebSecurity public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { //项目路径放行,其他权限验证,注销可以访问,表单登录支持 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/").permitAll() .anyRequest().authenticated() .and() .logout().permitAll().and() .formLogin(); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/js/**","/css/**","/images/**"); } }