我正在测试apache shiro并且刚刚构建了位于https://github.com/pires/simple-shiro-web-app的简单演示
这只是shiro的一个简单用法,它尝试使用jdbcrealm进行身份验证。除了
之外,每件事情都可以成功后,Shiro不会更改SESSIONID 认证。这意味着SESSIONID在用户时是相同的 一旦用户通过身份验证,就会到达登录页面。
还注意到,如果我关闭了成功通过验证 浏览器,下次打开并导航到页面时,我需要登录 再次。
这是shiro的常见行为吗?如果是,为什么?
答案 0 :(得分:1)
如前所述,shiro在用户登录时不会生成新ID。您可以自己轻松地实现这一点:
@Override
protected boolean executeLogin( final ServletRequest request, final ServletResponse response )
throws Exception
{
final AuthenticationToken token = createToken( request, response );
if ( token == null )
{
throw new IllegalStateException( "Your error message here" );
}
try
{
// Stop session fixation issues.
// https://issues.apache.org/jira/browse/SHIRO-170
final Subject subject = getSubject( request, response );
Session session = subject.getSession();
// Store the attributes so we can copy them to the new session after auth.
final LinkedHashMap<Object, Object> attributes = new LinkedHashMap<Object, Object>();
final Collection<Object> keys = session.getAttributeKeys();
for ( Object key : keys )
{
final Object value = session.getAttribute( key );
if ( value != null )
{
attributes.put( key, value );
}
}
session.stop();
subject.login( token );
// Restore the attributes.
session = subject.getSession();
for ( final Object key : attributes.keySet() )
{
session.setAttribute( key, attributes.get( key ) );
}
return onLoginSuccess( token, subject, request, response );
}
catch ( AuthenticationException e )
{
return onLoginFailure( token, e, request, response );
}
}
答案 1 :(得分:0)
AFAIK shiro在登录时不会更改会话ID。我确实在我的项目中使用它,并没有看到它确实改变了会话ID。我认为这只是他们不支持的功能。当我切换到春天时,我遇到了各种各样的问题,因为spring确实支持这种行为。
关于你的第二点,我认为它与会话的持续时间有关。该会话可能配置为仅持续到浏览器关闭。如果Shiro使用url重写来维护会话,则必须请求另一次登录,因为url上的会话ID后缀将丢失。使用cookie可以支持这种行为,尽管这样做的典型方法是使用remember-me cookie。