用户访问网站时,只能请求其有权限的网址,而不能手动去请求其权限以外的网址。
基本配置
以下配置了3个url请求时各需要的角色或权限,注意,这并不代表现实业务中的角色和权限,你可以根据需要自己决定。
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests() //进行权限配置
.antMatchers("/anonymous1").hasAnyRole("ANONYMOUS")//角色ANONYMOUS
.antMatchers("/anonymous2").hasAnyAuthority("ROLE_ANONYMOUS")//权限ROLE_ANONYMOUS
.antMatchers("/anonymous3").anonymous()//匿名用户
.anyRequest().authenticated()//以上未配置的其他url,需要登录才能访问
.and()
.formLogin().and() //开启formLogin便于测试
.csrf().disable();
匿名用户
spring security中有匿名用户的概念,即你没有登录,仍然会给你分配匿名权限:ROLE_ANONYMOUS。而带ROLE_前缀的权限 ROLE_xxx 等同于角色 xxx ,所以上面三个/anonymous的访问权限是一模一样的,不需要登录可匿名访问。相反,登录以后就不再拥有匿名权限,将无法再访问这三个url。但是其他url必须登录以后才能访问。
常用的权限配置方法
- hasAnyRole:用户拥有方法参数中任意一个角色,如上代码中就是。
- hasAnyAuthority:用户拥有方法参数中任意一个权限。
- authenticated:登录用户。
- anonymous:匿名用户。
- permitAll:任何人都能请求。
- denyAll:任何人不能请求。
- rememberMe:使用记住我方式登录的用户可以请求,以后会讲。
- fullyAuthenticated:使用记住我方式登录的用户不可请求。
- hasIpAddress:指定ip地址的用户。
- not:求反,可用于其他方法的前缀。如.not().hasAnyRole("ANONYMOUS")指没有ANONYMOUS角色的用户。
- access:使用SpEL表达式,如下
SpEL表达式
以上方法一次只能配置一种,如果一个url要同时匹配多种方法,可使用SpEL表达式,如下,用户同时具备role角色和auth权限。
.antMatchers("/any").access("hasAnyRole('role') and hasAnyAuthority('auth')")
- and和or:逻辑与和逻辑或。
- hasAnyRole(xxx):拥有xxx中的一个角色。
- hasAnyAuthority(xxx):拥有xxx中的一个权限。
- isAuthenticated():登录用户。
- isAnonymous():匿名用户。
- permitAll:任意用户。
- denyAll:拒绝请求。
- isRememberMe():记住我登录。
- isFullyAuthenticated():非记住我登录。
- hasIpAddress(xxx):限制ip。
- !:求反。
- 含对象的表达示,如下:只有用户名user可以请求。authentication对象是非常重要的核心对象,以后详解
.antMatchers("/any").access("authentication.name=='user'")
静态资源
spring security默认会拦截任何请求,以下方法可以排除静态资源。
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/**.html","/**.js");
}