【问题标题】:Apache shiro remember me not workingApache shiro 记得我不工作
【发布时间】:2014-12-03 06:14:16
【问题描述】:

我正在尝试使用 apache shiro 的 rememberme 功能,但它不起作用。

我有这个 shiro.ini

[main]
ds = org.apache.shiro.jndi.JndiObjectFactory   
ds.requiredType = javax.sql.DataSource  
ds.resourceName = java:/comp/env/jdbc/myDS


# JDBC realm config  
jdbcRealm = br.com.myproject.web.service.security.JdbcRealmImpl
jdbcRealm.permissionsLookupEnabled = true 
jdbcRealm.authenticationQuery = SELECT password FROM user WHERE username = ? AND status = 1
jdbcRealm.dataSource = $ds

sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
jdbcRealm.credentialsMatcher = $sha256Matcher
securityManager.realms = $jdbcRealm

[urls]
/** = authcBasic

这是我的 JdbcRealmImpl:

public class JdbcRealmImpl extends JdbcRealm {

    public JdbcRealmImpl() {
        super();
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            final AuthenticationToken token) throws AuthenticationException {

        final AuthenticationInfo info = super.doGetAuthenticationInfo(token);

        final UserDB userDB = new UserDB();
        final User user = userDB.getUserByUsername((String) token.getPrincipal());

        return new SimpleAuthenticationInfo(user, info.getCredentials(), getName());
    }    

}

由于这是一个网络服务项目,我有一个登录服务:

@POST
@Path("/login")
public Response login(@FormParam("username") final String username, @FormParam("password") final String password, @FormParam("remember") final boolean remember) {

    final Subject currentUser = SecurityUtils.getSubject();

    if (!currentUser.isAuthenticated()) {
        final UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            token.setRememberMe(remember);
            currentUser.login(token);
        } catch (final AuthenticationException e) {
            return Response.status(Status.BAD_REQUEST).entity("Invalid user").build();
        }
    }

    return Response.ok().build();
}

问题是 SecurityUtils.getSubject().isRemembered() 总是返回 false,即使我设置了 token.setRememberMe(true);

我是否缺少任何配置?

【问题讨论】:

    标签: shiro remember-me


    【解决方案1】:

    Subject.isRemembered() 在 Shiro 中有点棘手。仅当主题具有有效的记住我设置(cookie 等)并且主题未经过身份验证时,它才会返回 true。详情在这里:http://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/subject/Subject.html#isRemembered()

    所以,我怀疑您的 Remember Me 工作正常,但您对 Subject.isRemembered() 的期望与该方法的实际作用不符。

    【讨论】:

      【解决方案2】:

      实际上,如果您通过 shiro 注销从您的应用程序中注销,请记住我将被删除。要尝试使会话超时一分钟,让会话自行过期并重新加载主页,您会发现实际上正在记住用户。注销清除记住我。

      如果您想在注销后仍然使用记住我,您可以尝试扩展 securitymanager 并将此安全管理器用于您的应用程序。

      public class CustomSecurityManager extends DefaultWebSecurityManager {
          @Override
          protected void beforeLogout(Subject subject)
          {
              super.removeRequestIdentity(subject);
          }    
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-18
        • 2014-09-22
        • 2018-08-20
        • 2017-09-27
        • 2014-03-09
        • 2013-05-12
        • 2017-02-19
        • 2012-04-27
        • 2014-10-26
        相关资源
        最近更新 更多