为 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的主要内容,如果未能解决你的问题,请参考以下文章
自动装配在 Apache Shiro 自定义领域类中不起作用