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

在KeyCloak中进行身份验证之前在服务器中设置请求标头

松国兴
2023-03-14

我正在使用基于键斗篷头的身份验证来保护REST API。在那里,我想设置一个请求头字段(基本上是密钥斗篷授权头)之前,编写发生。

另一种解释是:如何获取javax。servlet。在密钥斗篷身份验证之前调用筛选器

在这次尝试中,我尝试调用被覆盖的headerbasedkeydeposeconfigresolver的resolve方法,并对web进行了调整。xml。我可以注意到,它可以在身份验证发生之前调用。我还读取了一些请求头值,但没有setter将请求头设置到那里(toorg.keydepot.adapters.spi.HttpFacade.request)。

在以这种或那种方式进行KeyClope身份验证之前,寻找设置请求头的提示吗?

  • 关键的克劳克版本:3.1.0。最终

HeaderBaseKeyClope配置解析程序。JAVA

public class HeaderBasedKeycloakConfigResolver implements KeycloakConfigResolver {

    @Override
    public KeycloakDeployment resolve(Request request) {

        String uri = request.getURI();
        logger.info("resolve().uri : " + uri);

        String auth_key = request.getHeader("auth_key");
        logger.info("resolve().auth_key : " + auth_key);

        request.setHeader("Autherization","<auth value>"); // there's no this like setter

        KeycloakDeployment deployment = cache.get(applicationId);
        --build deployment using the keycloak.json"

        return deployment;
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <!-- more security-constraint -->

    <!-- keycloak -->

    <context-param>
        <param-name>keycloak.config.resolver</param-name>
        <param-value>package.to.class.HeaderBasedKeycloakConfigResolver</param-value>
    </context-param>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>REST endpoints</web-resource-name>
            <url-pattern>/ep-name/resource-name</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>resource-name</role-name>
        </auth-constraint>
    </security-constraint>

    <!-- more security-constraint -->
    <!-- more security-constraint -->
    <!-- more security-constraint -->

     <login-config>
        <auth-method>KEYCLOAK</auth-method>
        <realm-name>realm-name</realm-name>
    </login-config>

    <security-role>
        <role-name>role-name-for-resource-1</role-name>
        <role-name>role-name-for-resource-2</role-name>
        <!-- more security-role -->
        <!-- more security-role -->
        <!-- more security-role -->
    </security-role>

    <listener>
        <listener-class>
            org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>

    <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/resource-path/*</url-pattern>
    </servlet-mapping>

</web-app>

共有1个答案

伊裕
2023-03-14

当您在配置中使用安全约束时,您可以这样做:

public class CustomConstraintSecurityHandler extends ConstraintSecurityHandler{

    @Override
    public void handle(String pathInContext, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException{

        try {
            // change the request
            super.handle(pathInContext, baseRequest, request, response);            
        }catch(Exception e) {

        }

    }
}

我以前没有使用过基于xml的配置,但在Java配置中,我使用了ConstraintSecurityHandler类似这样的配置:

    ContextHandlerCollection contexts = new ContextHandlerCollection();
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY );
KeycloakJettyAuthenticator kcAuthenticator = // set keycloak through JSON
    CustomConstraintSecurityHandler securityHandler = new CustomConstraintSecurityHandler();
    ConstraintMapping constraintMapping = new ConstraintMapping();
    constraintMapping.setPathSpec("/*");                
    Constraint constraint = new Constraint();           
    constraint.setAuthenticate(true);
    constraint.setRoles(new String[]{"**"});
    constraintMapping.setConstraint(constraint);                
    securityHandler.addConstraintMapping(constraintMapping);                            
    securityHandler.setAuthenticator(kcAuthenticator);
    context.setSecurityHandler(securityHandler);

编辑:

我的答案基于这样一个事实:在调试堆栈跟踪中,ConstraintSecurityHandler位于keydepore身份验证处理程序之前。

 类似资料:
  • 情况 我想为我的web应用程序使用Azure B2C身份验证服务。但是,我希望应用程序管理员限制对某些电子邮件或域的访问,例如白名单,如下所示: tom1@abc.com tom2@def.com *@alphabet.com 因此,只有前两封电子邮件和任何以“alphabet.com”结尾的电子邮件才能访问该网站。 问题 我已经实现了所有功能,并且工作正常,但是我正在努力获取经过身份验证的用户的

  • 问题内容: 前言 这是我第一次尝试过滤器,要小心。 项目介绍 我正在尝试为我们的一些应用程序最终确定SSO的构建,而且似乎步履维艰。我尝试连接的Webapp使用“身份验证”标头来确定应用程序内的用户凭据。我构建了一个Filter,希望在将标头传递到Web应用程序之前对其进行设置。 问题 该代码通过Eclipse验证,编译,加载到Tomcat,然后传递到Webapp。唯一缺少的是Authentica

  • 我正在尝试在我的Laravel 6应用程序中使用smtp电子邮件功能。 有趣的是: 它在我的本地主机中工作正常 它也在我的服务器中工作(没有超文本传输协议) 当我在服务器中应用https时,它停止工作。 它给了我以下错误: 使用3个可能的身份验证器在用户名"*********@gmail.com的SMTP服务器上进行身份验证失败。身份验证器LOGIN返回预期响应代码235,但得到代码“534”,并

  • 在使用带有Keycloak的REST身份验证时,我的id_token为null(服务器端)。要连接到应用程序,我使用文档中提供的以下URI:(带有适当的表单参数grant_type、username、password,...请参阅此处)。作为响应(客户端),我可以检索access_token和id_token。然后,我正在使用HTTP头中的“承载”授权与服务器进行讨论。在使用我的自定义客户端时,服

  • 如何在处理正文请求之前验证身份验证? 我正在使用vertx: 我想在处理正文请求之前验证身份验证。但我得到了错误的java。lang.IllegalStateException:请求已被读取 使用暂停功能上的延迟复制: 当运行delay(100)时(这是验证过程的示例),我得到了上面的错误。如果我对延迟(100)进行注释,它可以正常工作。

  • 我正在尝试用.NET中的LDAP制作一个简单的身份验证系统。我检查了.NET中的一些名称空间,并简单地制作了标准代码片段,如下所示。 我有一个管理员用户名和密码和,用于对客户端应用程序进行身份验证。我有第二个用户名和密码和,需要在LDAP中检查才能登录。 是管理帐户,只是LDAP中的用户。那么如何检查的密码呢?