总结 前后端分离 springboot+shiro登录验证的几种方式
登录验证
在前后端的登录验证中,如果当前用户未登录要返回给前端一个状态码。返回给前端状态码有以下几种方式(暂时只知道这些)
硬编码方式(不推荐)
在获取当前登录者id时判断是否已经登录,如果没有登录就抛出自定义异常,通过全局异常捕获返回给前端固定的状态码
public Long getLoginID() {
Subject subject = SecurityUtils.getSubject();
if (!subject.isAuthenticated()) {
throw new AuthException("请先登录");
}
TUser tUser = new TUser();
try {
PropertyUtils.copyProperties(tUser,subject.getPrincipal());
} catch (Exception e) {
e.printStackTrace();
}
return tUser.getId();
}
在自定义过滤器中返回给前端错误码
注意:不要在过滤器中抛出异常,全局异常捕获是捕获不到的,可以使用shiro的WebUtils类返回给前端错误码
public class AuthFilter extends AuthenticatingFilter {
@Override
protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
return null;
}
@Override
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
servletResponse.setContentType("application/Json");
servletResponse.setCharacterEncoding("UTF-8");
Subject subject = this.getSubject(servletRequest, servletResponse);
if (!subject.isAuthenticated()) {
WebUtils.toHttp(servletResponse).sendError(HttpServletResponse.SC_UNAUTHORIZED);
// throw new AuthException("请先登录");
}
return false;
}
}
设置shiro的loginURL
编写一个接口,在该接口中抛出异常,通过全局异常捕获返回给前端,将该url作为shiro的登录url
@GetMapping("redirect")
public Result redirect() {
throw new AuthException("请先登录");
}
shiro配置类中:
bean.setLoginUrl("/user/redirect");
使用注解方式(推荐)
在需要登录才能访问的接口上添加@RequiresAuthentication注解,如果未登录该注解会抛出UnauthenticatedException异常,在全局异常捕获中处理即可
@GetMapping("group/list")
@ApiOperation("获取个人作品集列表")
@RequiresAuthentication
Result<List<SimpleGroupVO>> findGroupListByOwner(@RequestParam Long owner) {
owner = getLoginID();
List<SimpleGroupVO> groupList = groupService.getGroupList(owner);
return Result.OK(groupList);
}
权限控制
使用注解方式
在实现用户认证操作和授权操作的类中重写授权操作的方法,获取登陆用户,添加用户角色
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
TUser user = (TUser) principals.getPrimaryPrincipal();
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
simpleAuthorizationInfo.addRole(user.getType() + "");
return simpleAuthorizationInfo;
}
在shiro的配置文件中添加开启注解验证的方法
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
AuthorizationAttributeSourceAdvisor attributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
//设置安全管理器
attributeSourceAdvisor.setSecurityManager(defaultWebSecurityManager);
return attributeSourceAdvisor;
}
在需要权限认证的接口上添加注解@RequiresRoles(“角色”),非指定角色的用户访问就会抛出UnauthorizedException异常,在全局异常中处理即可