2014-10-08 3 views
1

Im пытается использовать функцию rememberme от apache shiro, но ее не работает.Apache shiro запомнить меня не работает

Я это 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() .Remembered() всегда возвращает false, даже когда я устанавливаю token.setRememberMe (true);

Есть ли какая-либо конфигурация, которая отсутствует?

ответ

2

Subject.isRemembered() немного сложно в Сиро. Он возвращает true только в том случае, если у Субъекта есть действительная опция «Запомнить меня» (cookie и т. Д.), И объект не проверяется подлинностью. Подробности здесь: http://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/subject/Subject.html#isRemembered()

Итак, я подозреваю, что ваш Remember Me работает нормально, но ваши ожидания для Subject.isRemembered() не соответствуют тому, что на самом деле делает этот метод.

2

На самом деле, если вы выходите из своего приложения через shiro logout, помните, что я буду удален. Чтобы попытаться сделать сеанс тайм-аутом всего на одну минуту, пусть сеанс истечет сам и перезагрузит главную страницу, теперь вы обнаружите, что пользователь действительно запоминается. ПОСМОТРЕТЬ ПОСМОТРЕТЬ МЕНЯ.

Если вы хотите использовать, помните меня еще после выхода из системы, вы можете попытаться расширить securitymanager и использовать этот безопасный инструмент для своего приложения.

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

 Смежные вопросы

  • Нет связанных вопросов^_^