shiro不同客户端登录的配置问题

本贴最后更新于 1810 天前,其中的信息可能已经时异事殊

项目中有 PC 端和手机端权限验证,在配置中应该如何配置不同的过滤器(手机端和 PC 端处理逻辑不同)

赞助商 我要投放

10 回帖
请输入回帖内容 ...
  • 88250

    两个端上面用户的登录验证是一样的么?

  • wohaha

    @88250 部分逻辑不一样,Web 有跳转页面,有验证码,移动端没有,看样子得自定义一个过滤器,验证 token 的形式进行校验

  • 88250

    嗯,shiro 我没怎么用过,你有时间分享一下使用经验吧~

  • DASHU

    shiro 登陆不需要配置过滤器。

    实际上你只需要调用

    SecurityUtils.getSubject().login(token);
    

    方法就可以了。

    如果你想要让手机接口通过 token 来实现 session 保持。可以通过一个不用 user 校验的接口来实现登陆(调用上面的方法),然后再把当前的 sessionId 返回到客户端。

    客户端每一次请求,都把 sessionId 放到请求头中。

    然后再实现一个自定义 SessionManager,例如:

     public class MyWebSessionManager extends DefaultWebSessionManager {
    
        @Override
        public Serializable getSessionId(SessionKey key) {
            // 从 cookies 和 url 中获取 sessionid.
            Serializable id = super.getSessionId(key);
    
            // 如果没有,则从 header 中获取 id.
            if (id == null && WebUtils.isWeb(key)) {
                ServletRequest request = WebUtils.getRequest(key);
                ServletResponse response = WebUtils.getResponse(key);
    
                if (request instanceof HttpServletRequest) {
                    id = ((HttpServletRequest) request).getHeader(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
                }
            }
            return id;
        }
    
    }
    

    回答问题还要扣分 ...

    大大影响积极性!!

  • 88250

    @DASHU 评论的投票会弥补这个的,敬请期待~

  • wohaha

    @DASHU 项目中已经配置了,要是不配置会直接跳转到登录界面,我最后用了一个方法






  • wohaha

    @DASHU 自己定义了一个 filter

        public class MobileFormAuthenticationFilter extends org.apache.shiro.web.filter.authc.AuthenticatingFilter 		{
    
    protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) {
    	String username = request.getParameter("username");
    	String password = request.getParameter("password");
    	if (password==null){
    		password = "";
    	}
    	boolean rememberMe = isRememberMe(request);
    	String host = StringUtils.getRemoteAddr((HttpServletRequest)request);
    	return new UsernamePasswordToken(username, password.toCharArray(), rememberMe, host, null, false);
    }
    
    @Override
    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e,
             ServletRequest request, ServletResponse response) {
    	return true;
    }
    @Override
    protected boolean onAccessDenied(ServletRequest request,
    		ServletResponse response) throws Exception {
    	 return executeLogin(request, response);
    }
    

    }

  • wohaha

    @88250 XML 配置在评论中不能显示?

  • wohaha

  • 88250

    可以贴 XML 代码的。

请输入回帖内容 ...