基于角色或权限进行访问控制
一.hasAuthority方法("针对一个")
如果当前的主体具有指定的权限,这返回true,否者返回false
1.在配置类设置当前访问的地址有哪些权限
.antMatchers("/test/index").hasAuthority("admins")
config类中进行一个修改
@Override
protected void configure(HttpSecurity http)throws Exception{
http.formLogin()//自定义自己编写的
.loginPage("/login.html")//登录页面设置
.loginProcessingUrl("/user/login")//登录访问路径
.defaultSuccessUrl("/test/index").permitAll()//登录成功之后,跳转路径
.and().authorizeRequests()
.antMatchers("/","/test/hello","/user/login").permitAll()//设置那些路径可以直接访问,不需要认证
//当前登录用户,只有具有admin权限才可以访问这个路径
.antMatchers("/test/index").hasAuthority("admins")
.anyRequest().authenticated()//所有请求都可以访问
.and().csrf().disable();//关闭csrf防护
}
修改以下部分
.antMatchers("/","/test/hello","/user/login").permitAll()//设置那些路径可以直接访问,不需要认证
//当前登录用户,只有具有admin权限才可以访问这个路径
.antMatchers("/test/index").hasAuthority("admins")
.anyRequest().authenticated()//所有请求都可以访问
第二步:在UserDetailsService,把返回user对象设置权限
List<GrantedAuthority>auths=
AuthorityUtils.commaSeparatedStringToAuthorityList("admins");
其中admins和config配置类
.antMatchers("/test/index").hasAuthority("admins")一样
进行一个测试
把List<GrantedAuthority>auths=
AuthorityUtils.commaSeparatedStringToAuthorityList("abc");
权限改为abc在设置一个不能直接访问的页面进行一个登录
比如把/test/hello这个路径设置不能直接进去
.antMatchers("/","/user/login").permitAll()//设置那些路径可以直接访问,不需要认证
会出现这个表示没有权限
只有权限是一样的才会登录成功
第二中方法:hasAnyAuthority方法(针对多个)
如果当前的主体有任何提供的角色(给定的作为一个逗号分隔的字符串列表)的话,返回true
.antMatchers("/test/index").hasAuthority("admins,manager")
这个方法设置多个权限是不行的
.antMatchers("/test/index").hasAnyAuthority("admins,manager")
使用这个只要满足其中一个条件就可以
第三个方法hasRole
如果用户具备给定角色就允许访问,否则出现 403。
如果当前主体具有指定的角色,则返回 true。
先把第二步注释掉:
.antMatchers("/test/index").hasAnyAuthority("admins,manager")
写上:
.antMatchers("/test/index").hasRole("sale")//后面写的是角色
第二步:修改service层
//设置权限不能为空必须有值
List<GrantedAuthority>auths=
AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");
4 hasAnyRole
表示用户具备任何一个条件都可以访问。
给用户添加角色
修改配置文件:
角色不对就报403没有权限访问
There was an unexpected error (type=Forbidden, status=403).
自定义403页面
新增unauth.html
写上一句话
<h1>没有访问的权限</h1>
在配置类直接设置
@Override
protected void configure(HttpSecurity http)throws Exception{
//配置没有权限访问跳转自定义页面
http.exceptionHandling().accessDeniedPage("/unauth.html");
}
执行会直接跳转我们设置的页面