Создание пользовательской страницы входа + bean-компонента для Apache Shiro

У меня есть:

  1. Проект веб-приложения Java EE в Netbeans 7.2. Shiro-Web устанавливается и прекрасно работает со стандартными настройками в INI-файле: пользователи автоматически перенаправляются на стандартную страницу login.jsp, где они могут без проблем авторизоваться.

Я хочу:

  1. Чтобы создать пользовательскую страницу входа в систему, введите файл login.xhtml, аннотированный тегами PrimeFaces, где процесс входа обрабатывается вспомогательным компонентом.

Я нуждаюсь:

  1. Чтобы понять шаги, которые необходимо выполнить в этом бине входа в систему. В настоящее время у меня есть работающая Realm, и я могу аутентифицировать пользователя:

    UsernamePasswordToken currentUserToken = 
       new UsernamePasswordToken(userEmail, userPassword);
    
    try {
        SecurityUtils.getSubject().login(currentUserToken);
    }
    catch(UnknownAccountException uae) {
    
        // TODO: Notify user that no such account exists
    }
    catch(IncorrectCredentialsException ice) {
        // TODO: Notify user that login attempt failed due to bad credentials
    }
    
    // TODO: How to set up user session an everything else, if login succeeded?
    

    Однако какие дополнительные шаги мне нужно предпринять, чтобы убедиться, что сеанс пользователя (и все остальное) также правильно настроен? Я хочу оказаться в том же состоянии, как если бы я использовал стандартную функцию входа в Широ (настройка сеанса, соответствующие настройки и т. д.).

  2. В конце концов, чтобы понять, как настроить Широ НЕ для фильтрации тегов JSF на странице входа. В настоящее время для рендеринга по умолчанию используется стандартный HTML, и все графические элементы исчезают.


person csvan    schedule 07.10.2012    source источник


Ответы (1)


JSF обрабатывает вашу DefaultWebEnvironment, поэтому вам нужно расширить EnvironmentLoadListener и добавить к ней свою область.

public class CdiEnvironmentLoaderListener extends EnvironmentLoaderListener {

    //this is your implementation that extends Authorizing Realm
    ShiroRealm shiroRealm = null; 

    @Override
    protected WebEnvironment createEnvironment(ServletContext sc) {
        WebEnvironment environment = super.createEnvironment(sc);
        shiroRealm = new ShiroRealm();

        RealmSecurityManager rsm = (RealmSecurityManager) environment
            .getSecurityManager();

        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
        matcher.setHashAlgorithmName(Sha512Hash.ALGORITHM_NAME);

        shiroRealm.setCredentialsMatcher(matcher);

        rsm.setRealm(shiroRealm);

        ((DefaultWebEnvironment) environment).setSecurityManager(rsm);

        return environment;
    }
}

В файле web.xml добавьте настраиваемый список, а также фильтр по умолчанию и сопоставления фильтров из веб-примера.

<listener>
    <listener-class>com.company.security.CdiEnvironmentLoaderListener</listener-class>
</listener>

Используйте пользовательские библиотеки тегов JSF 2.0. можно найти здесь http://deluan.github.com/shiro-faces/

источники:

Apache Shiro с JSF 2.0! Как дела?

http://shiro-user.582556.n2.nabble.com/Shiro-in-CDI-JPA2-JSF2-project-td7577437.html

person deefactorial    schedule 07.10.2012
comment
На самом деле нет необходимости указывать одни и те же данные 3 раза. @ManagedBean и @SessionScoped здесь достаточно. Нет необходимости в атрибуте имени и записи Faces-config.xml. - person Arjan Tijms; 07.10.2012