springSectury结合jwt实现权限管理
提问
想做一个权限管理功能,本来的思路是用户登录在token里传入角色id但是token不能立即生效
所以想求一个思路,可不可以在登陆成功时查询到用户的角色id,并获取用户的权限列表传递给前端,第一次接触没有思路不知道怎么做,使用Sectury+jwt,关键在于怎么返回一个权限列表,数据库是有的,怎么返回。
想做一个权限管理功能,本来的思路是用户登录在token里传入角色id但是token不能立即生效
所以想求一个思路,可不可以在登陆成功时查询到用户的角色id,并获取用户的权限列表传递给前端,第一次接触没有思路不知道怎么做,使用Sectury+jwt,关键在于怎么返回一个权限列表,数据库是有的,怎么返回。
springsecurity可以的userDetail可以实现的
public interface UserDetailsService {
UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}
------------------------伪代码--------------------------
List<GrantedAuthority> grantedAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList("xxxxxxxx");
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
new User(userByUserName.getUsername(),bCryptPasswordEncoder.encode(userByUserName.getPassword()),grantedAuthorities);
}
也可以重写这玩意看下面
public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
建议不要在jwt里储存过多的内容,这会导致jwt变得超级长,储存一个角色ID或者本身用户的ID,在Security的jwt provider中把认证信息放到SecurityContext
好的大佬
嗯,本身也没打算存在token里,
你可以把用户的一整个对象(或者系统所有的角色及权限列表)存在redis或其他缓存中间件里,认证时通过jwt的subject或者其他信息去数据库里拿就行,redis的性能和速度是超级快的,这点不用担心。
然后你的系统可能需要根据用户或者角色权限等缓存的刷新做一点点小小的改进,在修改角色或者权限后刷新相关内容的缓存