security的简单原理:html
须要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码:壹零叁八柒柒肆六二六java
使用众多的拦截器对url拦截,以此来管理权限。可是这么多拦截器,不可能对其一一来说,主要讲里面核心流程的两个。web
首先,权限管理离不开登录验证的,因此登录验证拦截器AuthenticationProcessingFilter要讲;还有就是对访问的资源管理吧,因此资源管理拦截器AbstractSecurityInterceptor要讲;但拦截器里面的实现须要一些组件来实现,因此就有了AuthenticationManager、accessDecisionManager等组件来支撑。spring
如今先大概过一遍整个流程,用户登录,会被AuthenticationProcessingFilter拦截,调用AuthenticationManager的实现,并且AuthenticationManager会调用ProviderManager来获取用户验证信息(不一样的Provider调用的服务不一样,由于这些信息能够是在数据库上,能够是在LDAP服务器上,能够是xml配置文件上等),若是验证经过后会将用户的权限信息封装一个User放到spring的全局缓存SecurityContextHolder中,以备后面访问资源时使用。数据库
访问资源(即受权管理),访问url时,会经过AbstractSecurityInterceptor拦截器拦截,其中会调用FilterInvocationSecurityMetadataSource的方法来获取被拦截url所需的所有权限,在调用受权管理器AccessDecisionManager,这个受权管理器会经过spring的全局缓存SecurityContextHolder获取用户的权限信息,还会获取被拦截的url和被拦截url所需的所有权限,而后根据所配的策略(有:一票决定,一票否认,少数服从多数等),若是权限足够,则返回,权限不够则报错并调用权限不足页面。缓存
虽然讲得好像好复杂,读者们可能有点晕,不过不打紧,真正经过代码的讲解在后面,读者能够看完后面的代码实现,再返回看这个简单的原理,可能会有不错的收获。bash
在spring boot中使用security 首先导入spring security的包:服务器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
复制代码
在spring security中有一个很是重要的配置类须要编写 就是继承这个抽象类WebSecurityConfigurerAdapter,以下代码所示 这个bean的目的是将咱们的用户存到内存中,这个用于调试仍是能够的,可是咱们开发中是不存在这样的mybatis
@Bean
@Override
protected UserDetailsService userDetailsService(){
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("user_1").password("123456").authorities("USER").build());
manager.createUser(User.withUsername("user_2").password("123456").authorities("USER").build());
return manager;
}
复制代码
上面这步完成后还须要咱们将userdetail的类给添加到拦截器中,由于咱们登陆是须要进行验证用户的,因此能够直接mvc
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
复制代码
这里面还能够设置其余参数,好比加密的方式以及其余等等。 在这个类中海能够设置一写忽略的拦截类,即不须要进行验证的
/**
* 忽略设置的接口
*/
@Override
public void configure(WebSecurity web) throws Exception {
String ignoring = env.getProperty("msi.auth.ignoring","/health|/info");
web.ignoring().antMatchers(ignoring.split("\\|"));
}
复制代码
无论是使用哪一种方式,将用户存到内存或者存到数据库操做,都须要将操做放到
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
复制代码