spring security

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