当前位置: 首页 > 知识库问答 >
问题:

Web应用程序ApacheShiro集成

苏淇
2023-03-14

我试图了解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实体类。

共有1个答案

轩辕嘉平
2023-03-14

Shiro将自动拦截对受限资源的任何请求,并显示定义的登录屏幕。您只需声明应用程序资源所需的身份验证级别。使用您的代码:

[main]
shiro.loginURL = /login.xhtml
myRealm = com.example.shiro.MyRealm
securityManager.realms = $myRealm

[urls]
/account/** = authc
/logout = logout

你在告诉四郎:

  1. 要显示给用户的登录屏幕是/login.xhtml
  2. 你的Realm类是com.example.shiro.MyRealm。Shiro将实例化它,并将应用特定的安全操作委托给它。这里是您可以编写特定安全代码的地方。如果我没有理解错误,您的SecurityBean是您自定义的Realm,因此它应该重命名为com.example.shiro.MyRealm,或者您更改myRealm以指向该类.
  3. /账户/**=Authc/账户/中的每个资源都需要对用户进行身份验证。因此,如果用户尚未通过身份验证,任何尝试去那里的尝试都将导致Shiro显示登录页面。
  4. 当用户转到/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