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

Wildfly在Web应用程序中注销后缓存角色

皇甫雨华
2023-03-14

jboss网站。xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<security-domain flushOnSessionInvalidation="true">my-aktion
</security-domain>
<valve>
    <class-name>utils.MyAuthenticator</class-name>
</valve>
</jboss-web>

独立的。xml

<security-domain name="my-aktion" cache-type="default">
                <authentication>
                    <login-module code="utils.MyAuthenticator" flag="required">
                        <module-option name="dsJndiName" value="java:jboss/datasources/MySQLDS"/>
                        <module-option name="principalsQuery" value="SELECT password FROM user WHERE username=?"/>
                        <module-option name="rolesQuery" value="SELECT r.role, 'Roles' FROM Role r INNER JOIN user u ON u.role_id = r.id WHERE u.username=?"/>
                        <module-option name="hashAlgorithm" value="SHA-256"/>
                        <module-option name="hashEncoding" value="base64"/>
                    </login-module>
                </authentication>
            </security-domain>

网状物xml(摘录)

<security-constraint>
    <web-resource-collection>
        <web-resource-name></web-resource-name>
        <url-pattern>/Profile/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>User</role-name>
        <role-name>Manager</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>my-aktion</realm-name>
    <form-login-config>
        <form-login-page>/Login/login.xhtml</form-login-page>
        <form-error-page>/Login/error.xhtml</form-error-page>
    </form-login-config>
</login-config>
<security-role>
    <role-name>User</role-name>
</security-role>
<security-role>
    <role-name>Manager</role-name>
</security-role>

登录servlet。java(与doPost(…)相同)

@WebServlet("/Login/logout.xhtml")
public final class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public LogoutServlet() {
    super();
}

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    response.setHeader("Cache-Control", "no-cache, no-store");

    response.setHeader("Pragma", "no-cache");

    response.setHeader("Expires", new java.util.Date().toString());
    if (request.getSession(false) != null) {

        request.getSession(false).invalidate();// remove session.

    }

//      if (request.getSession() != null) {
//
//          request.getSession().invalidate();// remove session.
//
//      }
    request.logout();
    response.sendRedirect(request.getContextPath());    
}

我有一个自定义验证器,它扩展了DatabaseServerLoginModule,并覆盖createPasswordHash方法以确保其自身的安全性。

我的问题是,当我使用经理角色登录并使用其他浏览器更改登录用户的角色时,它会缓存该用户的角色。只有当我注销用户并再次登录时,他才能访问manager内容。我使用LogoutServlet注销。

我在servlet中尝试了各种更改,但没有帮助。当我从standalone.xml中删除“缓存类型=默认”时,它可以工作,但是对于在侧上执行的每个操作,都会调用身份验证模块中的登录方法,这非常糟糕。

在jboss网站上。xml参数flushOnSessionInvalidation=“true”似乎是这个问题的正确答案,但它没有效果。谢谢你的帮助!

共有1个答案

安承教
2023-03-14

这是计划在8.1中修复的wildfly 8.0.0中的一个错误。看见https://issues.jboss.org/browse/WFLY-3221

同时,当会话超时或无效时,您可以尝试此解决方法来清除特定用户的缓存

创建会话侦听器并从sessionDestroyed调用该方法。

public void clearCache(String username){
try {

    ObjectName jaasMgr = new ObjectName("jboss.as:subsystem=security,security-domain=<YOUR SECURITY DOMAIN>" );
    Object[] params = {username};
    String[] signature = {"java.lang.String"};
    MBeanServer server = (MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
    server.invoke(jaasMgr, "flushCache", params, signature);
} catch (Exception ex) {
    logger.warn(ex.getMessage());
}}
 类似资料:
  • 它给出: 下面是我使用的代码: 方法verifyUserExistance是; 我就是这样处理注销的;

  • 您好,我已经在codova开发了一个带有ionic framework的移动应用程序。我已经构建了这个应用程序,并开始在android mobile上进行测试。注销时,单击“我已在后面添加此代码”: 但在手机测试时间,当我注销时 我的控制器代码: 我的注销代码: 我访问数据的身份是:

  • 我使用Redis作为内存中的数据存储,用于spring boot应用程序中的缓存目的。目前,我已经为我需要缓存的实体实现了基本CRUD功能的Redis支持[Scenario 1]。但突然间,我发现有很多资源使用额外的Spring Boot缓存注释,比如来实现Redis的缓存[Scenario 2]。我监控到,当我们开始在find(params)这样的操作中使用这些注释时,只有第一个方法调用会被调用

  • 我的应用程序通过Facebook/Firebase进行身份验证。整个应用程序由片段和ofc一个活动组成。 案例(简单地): 有2个片段:和。 我在清除了缓存并从firebase和facebook注销后卸载了该应用程序。 在< code>howToFragment中,我检查是否已经有用户登录。 然后我在调试模式下安装应用程序。我看到该用户已登录并导航到主碎片。当我检查用户的ID时,我看到它是我的主要

  • 问题内容: 一个非常简单的要求。登录Web J2EE 6应用程序后,如何再次使用户注销? 我见过的大多数(全部?)书籍和教程都展示了如何在其应用程序中添加登录/登录错误页面,以及使用“ j_security_check”方法演示了安全主体/角色/领域等的使用-都很好。但是还不清楚如何赋予用户注销权限。确实,如何在会话超时等之后强制注销? 问题答案: 您应该使用以下方法使会话无效: 在Servlet

  • 我已经设置了一个使用OKTA作为IDP的应用程序。该应用程序基于SAML。这部分工作正常。 但我无法注销。为此,我们有1。已启用单一注销2。设置单一注销URL(我从标题Identity Provider Single Logout URL下的IDP元数据中收到此URL)3。Sp问题(我从标题Identity Provider Issuer下的IDP元数据中收到此消息)4。签名证书(这是IDP的证书