- 直接引入SpringBootSecurity依赖之后,就可以进行访问限制,账号是uesr,密码会在控制台上打印出来
=========== - 代码中账号密码的优先级高于配置文件中的优先级,只要在代码中配置,配置文件中的账号密码就会失效。
- 添加账号密码,通过注入的AuthenticationManagerBuilder,添加账号withuser().password().roles()。
- URL访问限制,就需要继承WebSecurityConfigurerAdapter类,并实现configure()方法,由于要实现的功能不同,configure()里面的参数也就不同,上面的AuthenticationManagerBuilder,这个是关于账号密码的添加,HttpSecurity是设置URL访问限制的。
- 实现方法级安全看这,本质上就是在调用这个方法的时候,校验这个用户是否有这个权限。
=========== - 通过数据库设置用户的角色信息。auth.userDetailsService(userService);要求userService实现UserDetailsService接口,接口中只有一个方法就是拿到用户详情对象UserDetails。可以理解为:
在你登录的时候,Security框架会拿着你的userService对象,调用里面的loadUserByUsername()方法创建一个user对象,里面封装了用户的基本信息,以及用户的角色列表。同时注意这个user对象也需要实现UserDetails接口,因为那个loadUserByUsername()方法的返回值就是这个类型。同时会将信息进行对比,正确并且有这个角色才允许进去。
- 从数据库中查询可以访问该URL的所需要的角色。首先拦截到请求对象,从对象中拿到URL,访问数据库,查看访问这个URL的所有角色,封装之后返回这个LIst。同时这时候我也有登陆用户的信息,其中包含了用户的角色信息,进行比对,具有相同的,则这个用户就具有访问这个URL的权限。否则抛出访问拒绝异常。
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
@Override
public <O extends FilterSecurityInterceptor> O postProcess(O object) {
//cfisms()作用是拿到所有的URL匹配的角色
object.setSecurityMetadataSource(cfisms());
//这个就是进行匹配校验
object.setAccessDecisionManager(cadm());
return object;
}
})
.and()
.formLogin()
.loginProcessingUrl("/login").permitAll()
.and()
.csrf().disable();
}
- 关于Catch看这篇文章
总结:
Security可以分为两种情况,是否是合法用户,是否有权限访问。
当用户登陆的时候, 首先根据Service的UserDetialService来查询用户,同时将用户的所有角色信息,进行封存。
在用户输完密码后,将用户的密码用相同的算法加密,跟缓存中的对象密码进行对比,相同则向下运行。
同时判断用户是否具有访问这个URL的角色,如果数据库中没有这个URL所对应的数据,也就是活它没被限制,可以继续运行。如果用户没有这个权限,就抛出权限不足的异常。