我正在使用基于键斗篷头的身份验证来保护REST API。在那里,我想设置一个请求头字段(基本上是密钥斗篷授权头)之前,编写发生。
另一种解释是:如何获取javax。servlet。在密钥斗篷身份验证之前调用筛选器
在这次尝试中,我尝试调用被覆盖的headerbasedkeydeposeconfigresolver的
resolve方法,并对web进行了调整。xml
。我可以注意到,它可以在身份验证发生之前调用。我还读取了一些请求头值,但没有setter将请求头设置到那里(toorg.keydepot.adapters.spi.HttpFacade.request
)。
在以这种或那种方式进行KeyClope身份验证之前,寻找设置请求头的提示吗?
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>
当您在配置中使用安全约束时,您可以这样做:
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中的用户。那么如何检查的密码呢?