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