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/**");
}
}
原文:https://www.cnblogs.com/q1359720840/p/10977075.html