gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:42:42 27 4
gpt4 key购买 nike

jboss-web.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>

standalone.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>

web.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>

LogoutServlet.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 方法。

我的问题是,当我使用管理员角色登录并使用另一个浏览器更改已登录用户的角色时,它会缓存该用户的角色。只有当我注销用户并再次登录时,他才无法访问管理器内容。我使用 LogoutServlet 来注销。

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

在jboss-web.xml中,参数flushOnSessionInvalidation="true"似乎是这个问题的正确答案,但它没有任何效果。感谢您的帮助!

最佳答案

这是 Wildfly 8.0.0 中的一个错误,计划在 8.1 中修复。请参阅https://issues.jboss.org/browse/WFLY-3221

同时,您可以尝试此解决方法,以便在 session 超时或无效时清除特定用户的缓存。

创建一个 Session 监听器并调用 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());
}}

关于security - Wildfly 在 Web 应用程序中注销后缓存角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21931637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com