Shiro 阿帕奇·西罗记得我没工作吗

Shiro 阿帕奇·西罗记得我没工作吗,shiro,remember-me,Shiro,Remember Me,我试图使用ApacheShiro的Memberme功能,但它不起作用 我有这个西罗 [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.secu

我试图使用ApacheShiro的Memberme功能,但它不起作用

我有这个西罗

[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());
    }    

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

@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.setRememberMetrue


是否有我缺少的配置?

Subject.isRemembered在Shiro中有点棘手。仅当主题具有有效的“记住我”设置cookie等且主题未经过身份验证时,才会返回true。详情如下:


因此,我怀疑您的“记住我”功能正常,但您对Subject.isRemembered的期望与该方法的实际功能不匹配。

Subject.isRemembered在Shiro中有点棘手。仅当主题具有有效的“记住我”设置cookie等且主题未经过身份验证时,才会返回true。详情如下:


因此,我怀疑您的“记住我”功能正常,但您对Subject.isRemembered的期望与该方法的实际功能不匹配。

实际上,如果您通过shiro注销“记住我”功能从应用程序注销,则该功能将被删除。若要尝试使会话超时一分钟,请让会话本身过期,然后现在重新加载主页,您将发现用户实际上被记住了。注销清除记住我

如果您想在注销后使用RememberMe,您可以尝试扩展securitymanager并在应用程序中使用此securitymanger

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

事实上,如果您通过shiro注销从应用程序注销,记住我将被删除。若要尝试使会话超时一分钟,请让会话本身过期,然后现在重新加载主页,您将发现用户实际上被记住了。注销清除记住我

如果您想在注销后使用RememberMe,您可以尝试扩展securitymanager并在应用程序中使用此securitymanger

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