2016-11-07 10 views
1

В мое приложение Java EE работает на сервере 9 WildFly, у меня есть модуль пользовательского входа в систему:JAAS выхода из системы не работает для пользовательского модуля входа

public class MyLoginModule extends AbstractServerLoginModule { 

    private Principal identity; 

    @Override 
    public boolean login() throws LoginException { 
     // do something 
     identity = new SimplePrincipal("test"); 
     subject.getPrincipals().add(identity); 
     // do something else 
     return true; 
    } 

    @Override 
    public boolean logout() throws LoginException { 
     subject.getPrincipals().remove(identity); 
     return true; 
    } 
} 

Метод login работает, как ожидалось. Но это не то же самое с методом logout. Когда я пишу что-то вроде request.getSession(false).invalidate(); с Servlet или веб-службой, метод logout достигает nerver.

Здесь мои файлы конфигурации:

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> 

    <display-name>customer-area</display-name> 

    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>restricted resources</web-resource-name> 
      <url-pattern>/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>*</role-name> 
     </auth-constraint> 
    </security-constraint> 

    <security-role> 
     <role-name>*</role-name> 
    </security-role> 

    <login-config> 
     <auth-method>MY-AUTH</auth-method> 
    </login-config> 

</web-app> 

JBoss-web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-web> 
    <security-domain>java:/jaas/MySecurityDomain</security-domain> 
</jboss-web> 

standalone.xml

<security-domain name="MySecurityDomain" cache-type="default"> 
    <authentication> 
     <login-module code="mypackage.MyLoginModule" flag="required"/> 
    </authentication> 
</security-domain> 

ServletExtension класс:

public class MyServletExtension implements ServletExtension { 

    @Override 
    public void handleDeployment(final DeploymentInfo deploymentInfo, ServletContext servletContext) { 

     deploymentInfo.addAuthenticationMechanism("MY-AUTH", new AuthenticationMechanismFactory() { 
      @Override 
      public AuthenticationMechanism create(String mechanismName, FormParserFactory formParserFactory, Map<String, String> properties) { 
       return new MyAuthenticationMechanism(); 
      } 
     }); 
    } 
} 

AuthenticationMechanism класс:

public class MyAuthenticationMechanism implements AuthenticationMechanism { 

    @Override 
    public AuthenticationMechanismOutcome authenticate(HttpServerExchange exchange, SecurityContext securityContext) { 

     PasswordCredential credential = new PasswordCredential(new char[] {}); 
     Account account = identityManager.verify("test", credential); 
     if (account != null) { 
      return AUTHENTICATED; 
     } else { 
      return NOT_AUTHENTICATED; 
     } 
    } 
} 

ли я что-то пропустил?

+0

@Loc вы говорите, что 'request.getSession (false) .invalidate()' не является способом вызова метода logout'? В этом случае я еще кое-что не понял. Может быть, вы можете просветить меня. – cheb1k4

+0

Вероятно, не имеет прямого отношения к проблеме + Возможно, я ошибаюсь (я не использовал JAAS в течение длительного времени), но правильно ли сохранить статус сеанса, т. Е. «Основной идентификатор», в модуле входа? –

+0

@ Loc здесь пример, где парень говорит: 'request.getSession (false) .invalidate()' является триггером для метода logout: http://www.byteslounge.com/tutorials/jaas-logout-example. Это не единственный пример, который я нашел. @NikosParaskevopoulos хороший вопрос. Я думаю, что это возможно, но, возможно, я ошибаюсь. Я проверю это позже. – cheb1k4

ответ

0

Метод, который позволяет достичь MyLoginModule.logout(), составляет request.logout(). Я должен был найти его сам!