SpringSecurity的基本原理

SpringSecurity框架作为一款安全框架,可以拦截我们的请求,默认情况下使用的是basic认证的方式,如图一那样。但是,这种方式很不友好,每次的密码都是动态的变化的,无法自定义,我们可以在application.properties配置security.basic.enabled=false进行关闭。但是此时谁都可以访问我们的接口,很不安全。此时可以在在跟包下创建一个BrowswerSecurityConfig类,集成WebSecurityConfiguerAdapter适配器,此时访问就是如图二那样SpringSecurity的基本原理-LMLPHPhttp.formLogin()//表示使用表单登录.and().authorizeRequests()//表示对请求的授权.anyRequest()//对任何请求授权.authenticated();//都需要身份认证

SpringSecurity的基本原理-LMLPHP

SpringSecurity的原来剖析

SpringSecurity实际上是一系列的过滤器链

SpringSecurity的基本原理-LMLPHP

1.UsernamepasswordAuthenticationFilter主要负责表单的认证

2.BasicAuthenticationFilter主要负责SpringSecurity默认的basic认证

3.ExceptionTranslationFilter:根据抛出的错误跳转到对应的页面

4.FilterSecurityInterceptor是过滤器类,根据我们的配置是否可以访问后台的接口

自定义用户认证逻辑

1.处理用户信息获取逻辑

要获取用户的信息就需要实现UserDetailsService,并且实现UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;方法

2.处理用户校验逻辑用户的校验可以使用关联我们的数据库,根据数据库的数据来进行校验,校验之后会返回一个UserDtails对象。这个对象类如下:

public interface UserDetails extends Serializable {
	Collection<? extends GrantedAuthority> getAuthorities();
	//用户名
	String getPassword();
	//密码
	String getUsername();
	//账户是否超时
	boolean isAccountNonExpired();
	//账户是否被冻结
	boolean isAccountNonLocked();
	//密码是否失效
	boolean isCredentialsNonExpired();
	//是否可用
	boolean isEnabled();
}

3.处理密码加密解密需要在BrowswerSecurityConfig.java配置passwordEncoder加密器

	/**
	 * 配置密码编码器
	 * [@return](https://my.oschina.net/u/556800)
	 */
	[@Bean](https://my.oschina.net/bean)
	public PasswordEncoder passwordEncoder(){
		return new BCryptPasswordEncoder();
	}

在MyUserDetailsService中的代码如下:

[@Component](https://my.oschina.net/u/3907912)
public class MyUserDetailService implements UserDetailsService {

	@Autowired
	PasswordEncoder passwordEncoder;
   private Logger logger = LoggerFactory.getLogger(MyUserDetailService.class);
	[@Override](https://my.oschina.net/u/1162528)
	public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
	   logger.info("登录用户名:"+s);

		String password = passwordEncoder.encode("123");
		logger.info("用户密码:"+password);
		return new User(s,password/*"123"*/,
				true,true,true,true,
				AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
	}
}

SpringSecurity的基本原理-LMLPHP

03-19 22:15