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

Spring安全性定义了用户向ROLE_USER注册

裴星洲
2023-03-14

我正在用Hibernate和SpringSecurity在SpringMVC4中做一个项目。在这个项目中,我有三个角色:<code>ROLE_USER

用户将像常规注册网站一样注册,但我对如何通过注册过程在数据库中保存新用户,如何保存Spring Security定义的新用户和数据库以及如何使用Hibernate获取该信息感到困惑。

谢谢。

共有1个答案

阎弘
2023-03-14

您将拥有您的User类,它实现了具有一个或多个权限的用户详细信息。例如:

用户

@Entity
@Table(name = "User")
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    private String username;

    @NotNull
    private String password;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER, orphanRemoval = true)
    private Set<UserAuthority> authorities;


    //helper method to set roles for this user
    public void grantRole(UserRole role) {
        if (authorities == null) {
            authorities = new HashSet<UserAuthority>();
        }
        authorities.add(role.asAuthorityFor(this));
    }

    //overrides, getters, setters
}

用户权限

@Entity
@IdClass(UserAuthority.class)
public class UserAuthority implements GrantedAuthority {

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnore
    @Id
    private User user;

    @NotNull
    @Id
    private String authority;

    //overrides, getters, setters
}

用户角色

public enum UserRole {
    USER, COMPANY, ADMIN;
}

创建用户时只需:

User user = new User();
user.grantRole(UserRole.USER);
repository.save(user);

至于身份验证,您需要实现从存储库加载用户的用户详细信息服务

UserDetailsService实现

@Service
public class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService {

    @Autowired
    private UserRepository repository;

    private final AccountStatusUserDetailsChecker detailsChecker = new AccountStatusUserDetailsChecker();

    @Override
    public final User loadUserByUsername(String username) throws UsernameNotFoundException {
        final User user = repository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        detailsChecker.check(user);
        return user;
    }
}

现在,在您安全配置中,您只需使用< code>UserDetailsService

@Autowired
private UserDetailsService userDetailsService;

@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

@Override
protected UserDetailsService userDetailsService() {
    return userDetailsService;
}

如何获取数据取决于您,我会使用Spring Data JPA来实现。

 类似资料:
  • 首先,请记住我是一个Java新手,这对我来说都是未探索的领域。 我遵循了一个指南(大约6个月前)来实现Spring Security性,但从未找到一个专门用于单独前端层的指南。 在实现令牌之前,每个步骤都有效,我得到了这个错误: 我在这里看到过其他类似的帖子,尽管它们讨论的内容不同 例如。 > 用户不能被强制转换为com.example.security.CustomUserDetailsSpri

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

  • 我遵循了spring boot安全教程,但最终结果有一个问题,即在成功登录后,浏览器重定向到。 我什至克隆了教程中引用的代码,认为我输入错误的内容,或者忘记添加组件或其他内容。不,同样的问题也存在。 在Stackoverflow上搜索时,我发现您需要在< code > WebSecurityConfigurerAdapter 的< code>configure方法中定义默认的成功URL,如下所示:

  • 我正在使用带有java配置和两个HttpSecurity配置的spring-security 3.2.0.rc2。一个用于REST API,一个用于UI。当我发布到/logout时,它重定向到/login?logout,但随后(错误地)重定向到/login。当我成功地输入用户名和密码时,我会被重定向到登录-注销,并且必须再次输入凭据才能进入主页面。因此,似乎login的permitAll不被用于l

  • 这是关于V.4(MVC+安全性)的。我实现了,其中在方法中向用户授予其权限。让我们简单地说: 还有一个安全控制器,其中有一个带有注释的带注释的方法: 正如您在方法中看到的,我显式地将角色授予了用户。但是,当我尝试访问时,我得到一个异常: 2016-04-19 10:25:16,899 DEBUG(http-nio-8080-exec-9)[org.springframework.security.

  • 问题内容: 在我的Web应用程序中,当我尝试注销时,它转到而不是给定的页面。在我的页面中,我添加了 问题是,当我使用spring security 3.1.4.RELEASE 版本时,此问题较早 起作用 。现在我正在使用 3.2.2.RELEASE 我也尝试了以下方法。没工作 spring-security.xml 提前致谢。 问题答案: 启用S​​pring Security CSRF保护后,必