如何从集合中获取对象?

ghhkc1vu  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(377)

我几天前开始学习 Spring 安全。在两个教程中发现了相同的代码,我不确定它是如何工作的。我意识到这只是简单的java,但我似乎不理解它。

public Set<SimpleGrantedAuthority> getGrantedAuthority(){
        Set<SimpleGrantedAuthority> permissions = getPermissions().stream()
                .map(permission -> new SimpleGrantedAuthority(permission.getPermission()))
                .collect(Collectors.toSet());
        permissions.add(new SimpleGrantedAuthority("ROLE_" + this.name()));
        return permissions;
    }

根据我对代码的理解,使用stream()我用simplegrantedauthority对象填充集合,这很好,但是这行是怎么工作的呢 permissions.add(new SimpleGrantedAuthority("ROLE_" + this.name())); ? 整个方法应该只返回给定角色的权限,但我不知道如何在返回的方法中只返回几个正确的权限。
方法调用:

protected UserDetailsService userDetailsService() {
        UserDetails annaS = User.builder()
                .username("annasmith")
                .password(passwordEncoder.encode("password"))
                .authorities(STUDENT.getGrantedAuthority())
                .build();
}

角色枚举:

public enum ApplicationUserRole {
    STUDENT(Sets.newHashSet()),
    ADMIN(Sets.newHashSet(COURSE_READ,COURSE_WRITE, STUDENT_WRITE, STUDENT_READ)),
    ADMINTRAINEE(Sets.newHashSet(COURSE_READ,STUDENT_READ));

    private final Set<ApplicationUserPermission> permissions;

    ApplicationUserRole(Set<ApplicationUserPermission> permissions) {
        this.permissions = permissions;
    }

    public Set<ApplicationUserPermission> getPermissions() {
        return permissions;
    }

    public Set<SimpleGrantedAuthority> getGrantedAuthority(){
        Set<SimpleGrantedAuthority> permissions = getPermissions().stream()
                .map(permission -> new SimpleGrantedAuthority(permission.getPermission()))
                .collect(Collectors.toSet());
        permissions.add(new SimpleGrantedAuthority("ROLE_" + this.name()));
        return permissions;
    } 
}

权限枚举:

public enum ApplicationUserPermission {
    STUDENT_READ("student:read"),
    STUDENT_WRITE("student:write"),
    COURSE_READ("course:read"),
    COURSE_WRITE("course:write");

    private final String permission;

    ApplicationUserPermission(String permission) {
        this.permission = permission;
    }

    public String getPermission() {
        return permission;
    }
}

如果有什么需要分析的话,如果有人能给我详细解释一下,我将不胜感激。

yhuiod9q

yhuiod9q1#

在springsecurity中,您可以填写userdetails authorities 有角色和/或特权。处理这些信息的方式是您自己的选择,所以引用行所做的只是添加 ApplicationUserRole 一起在同一个地方的特权。
对于这个框架来说,差别是最小的——它基本上以完全相同的方式处理这些问题。
spring安全框架并没有就我们应该如何使用这个概念给出任何指导,因此选择完全是针对具体实现的。
您可以在spring安全配置中使用它。
如:

@Override
protected void configure(HttpSecurity http) throws Exception {
    // ...
    .antMatchers("/protectedbyrole").hasRole("STUDENT")
    .antMatchers("/protectedbyauthority").hasAuthority("student:read")
    // ...
}

阅读更多https://www.baeldung.com/spring-security-granted-authority-vs-role.

相关问题