我想知道是否有办法提供两种不同类型的身份验证?用户应该使用基本身份验证来记录、注册、获取endpoint的用户数据/login
、/register
、/User
。当我调用/api
时,它应该只使用头中提供的JWT令牌进行身份验证。
但是当我调用/api
时,我会在没有任何身份验证的情况下获取所有数据。当用户登录并调用/user
时,API允许JWT访问/API
。
我的代码:
基本身份验证的配置:
@Configuration
@EnableWebSecurity
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().disable();
http
.authorizeRequests()
.antMatchers("/user").authenticated()
.antMatchers("/register").permitAll()
.and()
.formLogin().permitAll()
.defaultSuccessUrl("/user");
}
JWT auth的配置:
@Configuration
@Order(2)
public class JWTSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.antMatcher("/api/**")
.addFilterAfter(new JWTAuthorizationFilter(),UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic().disable();
}
我也有同样的问题,我希望对一些endpoint进行基本身份验证,而对其他一些endpoint,我希望使用其他身份验证方法。就像你的一样。您需要对一些endpoint进行基本身份验证(/login
,/register
,/user
),并对其他endpoint进行JWT身份验证(/api/**
)。
我在spring security中使用了一些关于多个入口点的教程,但不起作用。
通过创建自定义筛选器,将基本身份验证与JWT身份验证分开。
>
为/Basic
前缀(用于/Basic
请求)创建一个新的自定义过滤器,并检查基本身份验证
@Component
public class BasicAuthenticationFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
//Check for the requests that starts with /basic
if (httpServletRequest.getRequestURI().startsWith("/basic/")) {
try {
//Fetch Credential from authorization header
String authorization = httpServletRequest.getHeader("Authorization");
String base64Credentials = authorization.substring("Basic".length()).trim();
byte[] credDecoded = Base64.getDecoder().decode(base64Credentials);
String credentials = new String(credDecoded, StandardCharsets.UTF_8);
final String username = credentials.split(":", 2)[0];
final String password = credentials.split(":", 2)[1];
//Check the username and password
if (username.equals("admin") && password.equals("admin")) {
//continue
chain.doFilter(request, response);
} else
throw new AuthenticationCredentialsNotFoundException("");
} catch (Exception e) {
throw new AuthenticationCredentialsNotFoundException("");
}
} else chain.doFilter(request, response);
}
}
只为JWT编写主安全配置,并允许/basic
URL
@Configuration
@EnableWebSecurity
public class JWTSecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/basic/**").permitAll().and()
.csrf().disable()
.antMatcher("/api/**")
.addFilterAfter(new JWTAuthorizationFilter(),UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic().disable();
}
我正在使用apache camel,希望有多条路由。路线如下。
我正在尝试设置一个使用Jaeger/Prometheus的Spring应用程序。我已经通过prometheus.yaml文件成功配置了Prometheus,但我不明白如何配置Jaeger目标endpoint。我必须创建一个新的yaml文件并在其中指定配置吗?如果是,使用哪种语法?
你好,我有一个与SAAS模型和多租户相关的问题。 据我所知,SAAS多租户应用程序意味着所有客户机的通用功能,以及一些用户界面和功能的定制。 如果我需要为一些客户进行额外的客户特定定制,我如何实现它? 我了解SalesForce的方法 至于答案,我很高兴看到你们在数据库级别的定制,后端架构,或者这个主题的任何链接方面都有经验。
在我的控制器中,我有两个endpoint,其中一个是安全的,另一个是公共的: 仅当我已记录且具有正确角色的令牌放置在请求标头中时,受保护的终结点才有效。但是,当我想在没有令牌的情况下访问公共终结点时,我总是得到状态401,但有错误 需要完全身份验证才能访问此资源 这是我的安全配置: 和授权服务器配置: 我还尝试将更改为:没有更改。我的首选方法是使用注释处理安全性。谢谢。
#include <stdio.h> #include <pthread.h> int a = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(10); } } void *thread2_func(void
问题内容: 我正在将Primefaces 3.2与JSF 2.0一起使用。 我正在使用 而对于ajaxStatus: 我在同一页面上还有很多其他primefaces组件,但是我只希望在按下此特定按钮时呈现p:ajaxStatus。有什么好的解决办法吗?ajaxStatus在每个ajax事件上呈现。 问题答案: 如果您有少量按钮,则可以对其进行设置,然后在不进行此设置的情况下保留所需的按钮。 这样,