Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring:如何将角色应用于现有JWT令牌_Java_Spring_Spring Boot - Fatal编程技术网

Java spring:如何将角色应用于现有JWT令牌

Java spring:如何将角色应用于现有JWT令牌,java,spring,spring-boot,Java,Spring,Spring Boot,在SingleSignOn(SSO)中,当应用程序加载时,我从我的办公室网络获取jwt beareer令牌,基本上我在rest web服务中编写了代码,以从不同的web服务获取承载令牌 我想要的是: 我想在春季保护一些rest端点?我怎么能这么做 我不想提供登录和密码表单来重新登录。因为我已经在调用web服务来获取用户信息和承载令牌。这意味着我已经登录,我可以打印用户信息 我有一个userId的用户角色表,我只想将表中可用的这些角色应用到登录的用户Id 我们怎么做 我发现了这个,但我希望这不会要

在SingleSignOn(SSO)中,当应用程序加载时,我从我的办公室网络获取jwt beareer令牌,基本上我在rest web服务中编写了代码,以从不同的web服务获取承载令牌

我想要的是: 我想在春季保护一些rest端点?我怎么能这么做

我不想提供登录和密码表单来重新登录。因为我已经在调用web服务来获取用户信息和承载令牌。这意味着我已经登录,我可以打印用户信息

我有一个userId的用户角色表,我只想将表中可用的这些角色应用到登录的用户Id

我们怎么做

我发现了这个,但我希望这不会要求重新输入用户名和密码

我也有类似的问题

这里有很多事情要考虑:

用户身份验证:验证用户凭据时,我们将用户标记为已验证,并将其注册到
SecurityContext

您必须使用
AuthenticationProvider
对接收到的令牌进行身份验证

例:

我们根据从数据库接收的角色创建这些自定义权限实例。因此,在前面的
SSOAuthenticationProvider
中,我们执行以下操作

// make the database call, get roles for the user
List<String> roles = <db call to get roles>
authentication.setAuthorities(Collections.unmodifiableCollection(roles.stream().map(CustomAuthority::new).collect(Collectors.toList()));
SecurityContextHolder.getContext().setAuthentication(authentication);
//进行数据库调用,获取用户的角色
列表角色=
authentication.setAuthorities(Collections.unmodifiableCollection(roles.stream().map(CustomAuthority::new).collect(Collectors.toList());
SecurityContextHolder.getContext().setAuthentication(身份验证);
这将导致当前经过身份验证的用户拥有他们有权拥有的所有角色


唯一挂起的步骤是对每个端点的权限/角色进行硬编码。现在,当用户身份验证过程完成并执行端点验证时,Spring会查看当前端点所需的权限,并在当前身份验证的用户中查找这些权限。如果存在,则会执行端点代码。如果没有,
AccessDeniedException
被抛出

我想您是在尝试从前端应用程序执行SSO。在这种情况下,为什么不将令牌存储在cookie或应用程序存储中并重复使用?我可以存储令牌,并发送每个rest端点调用,但如何实现@HasAuthority('something'))由于该令牌来自另一个服务,因此它们没有映射到此表的表角色。您需要根据用户id将从表中获得的角色作为权限分配给SecurityContext中经过身份验证的当前用户。此外,还需要已根据定义的角色/权限endpoint@SunilChakravarthy如何实现这一点你显示示例我刚才回答了你的问题。很难回答所有问题。我假设你可以填补空白。不,我的项目中没有使用AuthenticationProvider。它从我的office网络检测到我的浏览器,我向SSO url发送请求,以获取令牌、我的用户名和用户ID。我的项目在你的案例中使用它,th验证代码中令牌的位置是您需要添加我在回答中指出的逻辑的位置。这应该可以解决您的问题。如果您没有身份验证对象,您可以创建一个。
public class CustomAuthority implements GrantedAuthority {

    private String role;

    public CustomAuthority(String role) {
        this.role = role;
    }

    @Override
    public String getAuthority() {
    return role;
    }
}
// make the database call, get roles for the user
List<String> roles = <db call to get roles>
authentication.setAuthorities(Collections.unmodifiableCollection(roles.stream().map(CustomAuthority::new).collect(Collectors.toList()));
SecurityContextHolder.getContext().setAuthentication(authentication);