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

用Java而不是用属性表示安全约束

裴卓君
2023-03-14

尝试跳过application.properties文件中安全约束的使用:

# keycloak.securityConstraints[1].authRoles[0] = admin
# keycloak.securityConstraints[1].securityCollections[0].patterns[0] = /admin

在Java安全和Spring配置中:

super.configure(http);
http.authorizeRequests().antMatchers("/admin*").hasRole("admin").anyRequest().permitAll();

但它们随后被忽视了。

我的应用程序。属性文件:

server.compression.enabled = true
server.compression.min-response-size = 2048
server.compression.mime-types = application/json,application/xml,text/html,text/xml,text/plain
server.connection-timeout = 5000
server.port = 8082

keycloak.enabled = true
keycloak.auth-server-url = http://localhost:8180/auth
keycloak.ssl-required = external
keycloak.realm = learnintouch
keycloak.resource = learnintouch-web
keycloak.public-client = true
# keycloak.bearer-only = true
# keycloak.credentials.secret = c123028f-2654-403b-a9d0-????????
# keycloak.cors = true
# https://stackoverflow.com/questions/41137766/keycloak-cors-filter-spring-boot

# This is an extra property that allows retrieving the username of the currently
# logged user from the Principal object
keycloak.principal-attribute = preferred_username

# keycloak.securityConstraints[0].authRoles[0] = user
# keycloak.securityConstraints[0].authRoles[1] = admin
# keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /user

# keycloak.securityConstraints[1].authRoles[0] = admin
# keycloak.securityConstraints[1].securityCollections[0].patterns[0] = /admin

# keycloak.securityConstraints[2].authRoles[0] = user
# keycloak.securityConstraints[2].authRoles[1] = admin
# keycloak.securityConstraints[2].securityCollections[0].patterns[0] = /products

我的Spring Security配置:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

// Avoid prefixing the roles with ROLE_
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
    keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
    auth.authenticationProvider(keycloakAuthenticationProvider);
}

// Use the Spring Boot properties file instead of the default Keycloak Spring Security Adapter keycloak.json file
@Bean
public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
    return new KeycloakSpringBootConfigResolver();
}

@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
    return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}

我使用的是Spring Boot2.0。3.释放和Keyclope适配器4.0。0.最终版本

更新:根据下面提供的答案,我用唯一的依赖项配置了KeyClope安全性:

<dependency>
  <groupId>org.keycloak</groupId>
  <artifactId>keycloak-spring-security-adapter</artifactId>
  <version>4.0.0.Final</version>
</dependency>

src/main/webapp/WEB-INF/keydape。json文件包含:

{
    "auth-server-url": "http://localhost:8180/auth",
    "ssl-required": "external",
    "realm": "learnintouch",
    "resource": "learnintouch-web",
    "public-client": "false",
    "credentials": {
        "secret": "??????..."
    },
    "principal-attribute": "preferred_username"
}

路由由一些Spring Security声明保护:

super.configure(http);
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user*").hasRole("user")
.antMatchers("/admin*").hasRole("admin")
.antMatchers("/products*").hasRole("user")
.anyRequest().permitAll();

共有1个答案

端木乐语
2023-03-14

要获得更灵活的配置,最好使用Spring Security适配器。它提供了用Java指定配置的能力,而不仅仅是应用程序属性。Spring Boot适配器旨在用作基本配置工具,以便将URI限制为特定角色。

为了使用Spring Security适配器,我首先要删除Spring Boot适配器,因为它们可能会导致冲突。如果您仍然希望使用应用程序属性使您的配置更灵活,那么您可以始终使用Spring Boot标准方式,因为最终,您只是在Spring Boot项目中使用了@configuration类。

 类似资料:
  • 我正在使用openApi maven插件为RESTAPI生成java请求/响应。 该请求有一个DateTime属性,当我运行生成器时,我会获得表示为java的属性的DateTime属性。时间OffsetDateTime。问题是我需要将属性表示为java。时间瞬间 这是请求的openApi规范: 生成的java请求: maven插件设置: 我已经尝试了和,如下所示,但它对生成的代码没有影响:

  • 我有一个Spring WebFlux安全性,如下所示,并希望使用属性控制CSRF。我如何在这里单独添加CSRF检查?

  • 问题内容: 我熟悉Java,但是刚开始学习JavaFX,尤其是学习JavaFX属性。我了解Oracle的以下示例所示的基本设计模式: 我不明白的是什么时候/为什么要使用getter和setter方法,而不是直接使用Property? 我在想的是,您可能希望在getter和/或setter中有一些自定义代码,这些代码可能对数据做一些前后操作/验证,但是如果您创建自定义getter和/或setter,

  • 当我使用security.basic.enabled=false在具有以下依赖项的Spring Boot项目上禁用安全性时: 为了修复此异常,我必须添加属性-management.security.enabled=false。我的理解是,当执行器在类路径中时,应该将security.basic.enabled=false和management.security.enabled=false设置为禁用

  • 本文向大家介绍为什么属性使用className而不是class呢?相关面试题,主要包含被问及为什么属性使用className而不是class呢?时的应答技巧和注意事项,需要的朋友参考一下 class是关键字 js会使用dom.className获取样式名,跟js保持一致

  • 问题内容: 我建议使用触发器来检查跨表完整性约束,以回答此问题。在评论中建议它可能会引起问题: 进行跨行检查的触发器在大多数数据库上很少起作用…因为它们无法从其他事务中读取未提交的行 不过,我没有找到任何支持该说法的消息来源。官方 文档未提及任何内容。我发现的其他问题在本文的SO上进行了介绍它主要批评潜在的隐藏复杂性,因为一眼就看不到触发器。但是,即使是评分最高的答案也承认其用于完整性问题。 所以