0
点赞
收藏
分享

微信扫一扫

总结 前后端分离 springboot+shiro登录验证的几种方式

Aliven888 2022-01-11 阅读 73

总结 前后端分离 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异常,在全局异常中处理即可

举报

相关推荐

0 条评论