我试图了解ApacheShiro工作流以及如何将其集成到我的应用程序中。我不明白的是,我如何以及在哪里执行登录,然后发送重定向?或者Shiro会自动执行此操作(因为我在ini文件中指定了域)?我可以发送自定义信息(用户属性)和重定向(通过Servlet响应而不是支持bean)吗?
到目前为止我所了解和拥有的:
将Shiro侦听器和过滤器添加到web。xml文件,以便它能够响应请求:
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
创建一个shiro。ini文件,您可以在其中为Shiro配置一些属性:
[main]
shiro.loginURL = /login.xhtml
myRealm = com.example.shiro.MyRealm
securityManager.realms = $myRealm
[urls]
/account/** = authc
/logout = logout
创建自定义领域类:
@Stateless
@Local(Realm.class)
public class SecurityBean implements Realm{
private EntityManager em;
private TypedQuery<Credential> cQuery;
@Override
public Account getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
try{
cQuery = em.createNamedQuery("getCredentials", Credential.class);
cQuery.setParameter("userName", ((UsernamePasswordToken) token).getUsername());
Credential c = cQuery.getSingleResult();
boolean b = Encryption.compare(new String(((UsernamePasswordToken) token).getPassword()), c.getSalt(), c.getEncryptedPassword());
if(b){
return c;
}else{
throw new AuthenticationException("Passwords do not match.");
}
}catch(Exception e){
throw new AuthenticationException("Error verifying credentials.");
}
}
@Override
public String getName() {
return "User Realm";
}
@Override
public boolean supports(AuthenticationToken token) {
if(token instanceof UsernamePasswordToken){
return true;
}else{
return false;
}
}
}
其中Encryption是用于加密和比较密码的类,Credential是用于存储用户名和密码的JPA实体类:
@NamedQueries({@NamedQuery(name = "getCredentials", query = "SELECT c FROM Credential c WHERE c.userName = :userName"),
@NamedQuery(name = "deleteCredentials", query = "DELETE FROM Credential c WHERE c.userName = :userName")})
@Entity
public class Credential implements Serializable, Account{
private static final long serialVersionUID = 2555682746921997545L;
@Id @GeneratedValue
private long id;
private String userName;
private String encryptedPassword;
private String salt;
private User user;
//... getters/setters...
}
其中User是实际存储用户应用程序信息的JPA实体类。
Shiro将自动拦截对受限资源的任何请求,并显示定义的登录屏幕。您只需声明应用程序资源所需的身份验证级别。使用您的代码:
[main]
shiro.loginURL = /login.xhtml
myRealm = com.example.shiro.MyRealm
securityManager.realms = $myRealm
[urls]
/account/** = authc
/logout = logout
你在告诉四郎:
/login.xhtml
com.example.shiro.MyRealm
。Shiro将实例化它,并将应用特定的安全操作委托给它。这里是您可以编写特定安全代码的地方。如果我没有理解错误,您的SecurityBean是您自定义的Realm,因此它应该重命名为com.example.shiro.MyRealm,或者您更改myRealm
以指向该类./账户/**=Authc
:/账户/
中的每个资源都需要对用户进行身份验证。因此,如果用户尚未通过身份验证,任何尝试去那里的尝试都将导致Shiro显示登录页面。/logout
时,shiro将结束会话我看到的是,您在[urls]
部分的开头缺少这一行:/login.xhtml=Authc
。/login.xhtml
不限于经过身份验证的用户(否则没有人可以登录),但仍必须为其指定Authc
过滤器,以便它可以处理该url的登录提交。它足够聪明,可以允许这些请求通过上面的shiro.loginUrl
指定的。
顺便说一句,如果你也想有一个完整的用户管理解决方案,看看Stormpath。我们也有一个插件,与Shiro无缝工作。你可以看看我们的示例Stormpath Shiro应用程序
免责声明,我是一名积极的Stormpath贡献者。
我正在尝试将Docusign API集成到我的web应用程序中。我尝试使用信封视图将我重定向到登录页或签名页。但是我想从我的web应用程序中重定向到添加收件人页面,在那里用户可以添加收件人,准备文档并将其发送给签名者。Docusign API中有这样的方法吗?
我有一个web应用程序,它通过applet进行文件传输。 出于更安全的原因,我计划对应用程序发送的文件进行加密。为此,我希望集成java web start程序,我将把RSA加密逻辑编写为web start jar的一部分。 我已经创建了一个单独的Web启动项目(WAR),并且能够启动jar 我的web start项目组件包括: 主类-加密。java(加密逻辑) 我用主类文件创建了一个签名jar,
问题内容: 我正在开发Java Web应用程序(ERP系统)。我已经完成了基本流程。现在,根据我的客户要求,我们需要实现一些搜索选项。(即员工,用户,发票,库存等), 我正计划为此实现一个搜索引擎。我觉得 elasticsearch 是我搜索的不错选择(如果有其他好的选择,请建议我)。 请给我建议一些好的文档,说明如何将 Elastic search 与java( Spring + Hiberna
本章将教您如何使用Maven管理基于Web的项目。 在这里,您将学习如何创建/构建/部署和运行Web应用程序。 创建Web应用程序 要创建一个简单的Java Web应用程序,我们将使用maven-archetype-webapp插件。 所以,让我们打开命令控制台,转到C:\MVN目录并执行以下mvn命令。 C:\MVN>mvn archetype:generate -DgroupId = com
我们正在使用Web Sphere 8.5和JProfiler 8.1。我想在Web Sphere 8.5中挂钩运行的JVM。我已经完成了远程应用程序;集成,之后我们必须在Java命令之后添加到我的远程应用程序的启动命令中。 “StartServer.sh”文件是Web Sphere的启动命令。 请您确认我们在下面一行或"setupCmdLine.sh"之后添加了上述命令(如果文件被StartSer
问题内容: 是否可以在现有的Java Apache Tomcat项目中引入osgi-equinox?据我了解,OSGI必须在某种“容器”中运行。我将如何整合它? 我还使用Jersey来获取RESTful资源。 问题答案: 在此桥模型中,安装了一个特殊的servlet,Tomcat调用该servlet来处理请求。OSGi运行时是从该servlet内生成的,但是OSGi运行时本身(例如,春分点)与HT