简介
上一篇我们实现了springboot简单的集成了spring security,实现了在用户想要实现某一操作时需要进行登陆认证,但是在登陆后用户能够进行所有想要的操作,这并不是我们想要的,我们需要的是当用户访问后,用户能够操作的是我们能够控制他能够操作接口。这里我们就需要进行权限的控制。
1、内存中实现权限控制
在上一篇中我们在实现用户认证后就没有进行相关的操作,这里我们想要在内存中实现权限认证。需要在securityConfig中重写configure(HttpSecurity http)方法,在接口中进行设置。
configure(HttpSecurity http)
在当前方法中能够实现对接口访问权限设置。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
//设置所有认证后的用户都能够访问所有接口,不需要任何权限
.anyRequest().authenticated()
//设置不需要登陆认证就能够访问登陆接口
.and()
.formLogin()
.permitAll()
// 设置不需要登陆认证就能够访问登出接口
.and()
.logout()
.permitAll();
}
如果我们想要对接口进行权限控制这里我们就要将
//.anyRequest().authenticated()
注释掉,然后再添加
.antMatchers("").hasAnyAuthority("")
然后添加想要进行权限控制的接口和设置访问当前接口需要的权限我们这里只写了/selByPhone接口所以我们的代码如下
.antMatchers("/selByPhone")
//设置访问当前接口需要的权限
.hasAnyAuthority("ROLE_query_user")
这里我们设置当前接口需要的权限是"ROLE_query_user"。完整的securityConfig的configure(HttpSecurity http)方法
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// .anyRequest().authenticated()
//配置访问当前接口需要的权限
.antMatchers("/selByPhone")
.hasAnyAuthority("ROLE_query_user")
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll();
}
然后再数据库中将用户的权限设置为query_user
然后访问selByPhone接口
!](https://img-blog.csdnimg.cn/88043ebba4ad4e3185f343412f8a1bc0.jpeg)
首先登陆没有访问权限的用户
登陆后我们能够看到当前用户没有访问权限spring security返回了403页面。
我们登陆有权限的用户,我们看到能够成功登陆
当然这种设置权限的方式并不是我们想要的,我们不能在写完接口后然后再securityConfig中进行配置,每次都进行这种配置并不是我们需要的,这时我们希望能够灵活的配置权限控制。小编这里基于jdbc进行动态的权限配置。当然并不只这一种方式,比如枚举类等等。
2、基于jdbc动态的权限控制
想要实现基于jdbc动态的权限控制,我们需要拦截请求获取到当前要访问的接口名称,然后再去查询想要访问当前接口需要的权限。
想要实现拦截请求的功能那我们就需要创建一个连接器,这里我们实现Filter完成权限拦截器。然后实现SecurityMetadataSource(安全元数据),完成查询当前需要的权限的功能,这里面我们使用他的子类FilterInvocationSecurityMetadataSource。然后我们再实现AccessDecisionManager(决策访问管理器)在这里我们判断当前登陆的用户是否拥有访问该接口的权限。
权限拦截器
/**
* @title: PermissionInterc