为 Apache Shiro 创建自定义登录页面 + bean

Posted

技术标签:

【中文标题】为 Apache Shiro 创建自定义登录页面 + bean【英文标题】:Creating a custom login page + bean for Apache Shiro 【发布时间】:2012-09-27 20:52:07 【问题描述】:

我有:

    Netbeans 7.2 中的 Java EE Web 应用程序项目。 Shiro-Web 已安装并在 INI 文件中的标准设置下运行良好:用户会自动重定向到标准 login.jsp 页面,在那里他们可以毫无问题地登录。

我想要:

    创建自定义登录页面 login.xhtml,使用 PrimeFaces 标记进行注释,其中登录过程由支持 bean 处理。

我需要:

    了解需要在此登录 bean 中执行的步骤。目前,我已经实现了一个工作领域,并且我能够对用户进行身份验证:

    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?
    

    但是,我需要采取哪些其他步骤来确保用户会话(以及其他所有内容)也已正确设置?我希望以相同的状态结束,就好像我使用了标准的 Shiro 登录功能(会话设置、适当的设置设置等)。

    最后,了解如何配置 Shiro NOT 以过滤掉登录页面中的 JSF 标签。目前,呈现默认为标准 HTML,所有图形好东西都消失了。

【问题讨论】:

【参考方案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 中添加自定义侦听器,以及来自 web 示例的默认过滤器和过滤器映射。

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

使用自定义 JSF 2.0 标记库。 在这里找到 http://deluan.github.com/shiro-faces/

来源:

Apache Shiro "with JSF 2.0" ! How does it go?

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

【讨论】:

确实没有必要指定3次相同的数据。 @ManagedBean@SessionScoped 在这里就足够了。不需要 name 属性和 faces-config.xml 条目。

以上是关于为 Apache Shiro 创建自定义登录页面 + bean的主要内容,如果未能解决你的问题,请参考以下文章

shiro自定义拦截url

自动装配在 Apache Shiro 自定义领域类中不起作用

Apache Shiro:将我重定向到登录页面

添加自定义过滤器 Apache Shiro + Spring Boot

CAS登录后回传除了ticket参数以外的其他自定义参数

Apache Shiro 身份验证自定义