一、针对请求HTTP进行配置
因为大家都知道Spring Security是对用户进行验证,那么程序是如何知道我们需要对所有的用户进行验证呢,这就需要我们针对http对于所有的请求都进行认证配置,其中,WebSecurityConfigurerAdapter抽象类已经提供了默认的配置,我们只需要扩展里面的配置
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//对于任何请求都需要进行认证
.authorizeRequests()
.anyRequest().authenticated()
//允许我们配置父级的方法来关闭XML中等效的java配置
.and()
//添加http请求的过滤器,对于要经过认证的url,需要经过过滤器去处理
.addFilter(new AuthBasicAuthenticationFilter(authenticationManagerBean()));
//关闭csrf,防止csrf攻击
http.csrf().disable();
}
二、授权请求
这里有两种,主要用于区分针对前端和其他的后台接口请求
对于前端,我们需要绕过后台的过滤器,所以适合用WebSecurity的方法
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/js/**", "/css/**", "/images/**", "/fonts/**", "favicon.ico");
//可以看到,以api为开头的接口也在里面,这表示WebSecurity可以过滤前后端的资源,只是更好的是比较适合前端过滤
web.ignoring().antMatchers("/login", "/error", "/api/open/**", "/api/user/login", "/api/user/logout" ,
"/session/invalid");
//可以仿照上面一句忽略静态资源
}
另一种方法还是用HttpSecurity提供的antMatcher()方法,即
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**", "/signup", "/about").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.anyRequest().authenticated() []
.and()
.formLogin();
}
注意:WebSecurity与HttpSecurity的区别:
顾名思义,WebSecurity主要是配置跟web资源相关的,比如css、js、images等等,但是这个还不是本质的区别,关键的区别如下:
ingore是完全绕过了spring security的所有filter,相当于不走spring security
permitall没有绕过spring security,其中包含了登录的以及匿名的。
用户身份的认证包括下面几个常见的步骤:
1、提示用户输入用户名与密码;
2、系统验证用户名密码的正确性;
3、获取该用户名的上下文信息(即用户在该系统中可用的信息,包括角色、权限);
4、为用户建立安全上下文;
5、继续执行其他的操作,譬如对比登陆权限等;
上面的前3项构成了系统的身份验证构成,他们在Spring Security中是如何创建对象并进行相关的操作的呢?
1、用户输入用户名密码,会将其组装成一个实例,即UsernamePasswordAuthenticationToken
2、将UsernamePasswordAuthenticationToken传递给AuthenticationManaager对象中进行验证,在这个过程中,会调用我们自己封装的UserDetailsService对象去获取该输入用户的具体的信息,包括该用户的角色、权限,并将返回封装了用户信息的对象Authentication对象中;
3、然后再通过适配器SecurityContextHolder.getContext().setAuthentication(authentication)将返回的身份验证对象保存在上下文中
参考链接:https://segmentfault.com/a/1190000012160850
网友评论