spring 添加角色到Google jwt [关闭]

lmvvr0a8  于 2023-09-29  发布在  Spring
关注(0)|答案(3)|浏览(116)

已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

14天前关闭
这篇文章是编辑并提交审查13天前.
Improve this question
我设法验证用户在Spring与jwt从angular谷歌登录我使用公钥验证令牌检索从angular但我想从jwt获得角色限制访问一些端点在Spring控制器因为谷歌令牌不提供远离添加属性如角色我怎么能让这个工作。我试图手动添加范围如读写基本上但它似乎我会添加更多的工作我有一个想法是从数据库中获得角色但我不知道它是否安全因为如果有人可以拦截服务器后端和angular之间的他可以修改响应并添加他想要的角色

package com.example.ressource_server.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception{
        httpSecurity.oauth2ResourceServer( r-> r.jwt(jwtConfigurer -> jwtConfigurer.jwkSetUri("https://www.googleapis.com/oauth2/v3/certs")));
        httpSecurity.authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
        return httpSecurity.build();
    }
}
cnjp1d6j

cnjp1d6j1#

配置Spring Security以基于提取的用户角色保护您的端点。您可以在WebSecurityConfigurerAdapter类中使用@PreAuthorize注解或配置安全规则:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/secure-endpoint").hasRole("ROLE_USER")
                .antMatchers("/admin-endpoint").hasRole("ROLE_ADMIN")
                .anyRequest().permitAll()
                .and()
            .oauth2Login()
                .and()
            .csrf().disable();
    }
}

上面我们使用hasRole来限制对特定角色的访问。确保从JWT令牌中提取的角色名称与安全配置中定义的角色相匹配。

gmxoilav

gmxoilav2#

要在Angular应用程序中基于从Google OAuth获得的角色或范围限制对Spring端点的访问,请执行以下步骤:
向Spring服务器上的JWT令牌添加自定义声明(如“scopes”),以表示用户角色或权限。
配置Spring Security以使用这些角色或作用域来控制对端点的访问。使用antMatchers指定每个端点需要哪些角色。
确保您的Angular应用程序将JWT令牌与每个请求一起发送到Spring后端,通常通过安全地存储它并将其包含在Authorization头中。
在解析令牌时,将JWT令牌中的“scopes”声明中的角色或范围Map到实际的SpringSecurity角色或权限。
使用Spring Security annotations(如@PreAuthorize)保护您的端点,或者基于角色或权限在方法级别配置安全性以限制访问。

dz6r00yl

dz6r00yl3#

我不会把角色放在JWT内部。当您添加非不可变的数据时,如果用户角色发生更改,会发生什么情况?你什么时候更新不在你服务器上的JWT?您必须添加一些更新逻辑和代码,以便在用户每次返回时检查新角色。使用MJM在他的回答中提到的声明可以做到这一点,但是如果角色更改在应用程序中有价值,那么它会有严重的缺点。请参阅此主题的辩论-> Is setting Roles in JWT a best practice?

更坚固的设计(IMO)

JWT通过不使用cookie查找来节省您到数据库的往返行程,但这并不意味着将所有内容都放入其中。将可变数据(如角色)放入DB中,并使用来自JWT的userId查找角色。如果你愿意学习一个非常标准化和流行的框架,那么我建议你学习Spring Security。它附带了很多安全工具,比如“记住我”,还有很多在线教程和视频。它支持JWT集成和角色。您可以标记您的控制器允许访问它们的角色,并在幕后为您处理授权/错误重定向....如果您决定仍然将角色放在JWT中,则只需搜索SDK中的“声明”以将自定义属性添加到您的jwt中,然后使用Spring Security JWT集成,以便您可以保护您的控制器,如下面的示例所示。

Spring安全示例

@Controller
@Secured("ROLE_SAMURAI")
class AdminController

参考资料

这个网站是一个良好的开端。他们有许多其他Spring Security教程-> https://www.baeldung.com/spring-security-oauth-jwt

相关问题