我试图使用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());
}
}
由于这是一个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.setRememberMe(true);
是否有任何配置缺失?
答案 0 :(得分:2)
在Shiro中,Subject.isRemembered()有点棘手。如果主题具有有效的“记住我”设置(cookie等)并且主题未经过身份验证,则它仅返回true。详情请见http://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/subject/Subject.html#isRemembered()
所以,我怀疑你的记住我工作正常,但你对Subject.isRemembered()的期望与方法的实际效果不符。
答案 1 :(得分:2)
实际上,如果您通过shiro注销从您的应用程序注销,请记住我将被删除。要尝试使会话超时只需一分钟让会话过期并重新加载主页现在你会发现该用户实际上被记住了。 LOGOUT CLEARS记住我。
如果您想在注销后仍然记得我,您可以尝试扩展安全管理器并将此安全管理器用于您的应用程序。
public class CustomSecurityManager extends DefaultWebSecurityManager {
@Override
protected void beforeLogout(Subject subject)
{
super.removeRequestIdentity(subject);
}
}