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

将用户保存在数据库中,Spring Security Registration表单

秦才
2023-03-14

我正在学习Spring安全。无法保存注册用户(如果他至少是注册字符串,因为我不知道)

WebSecurityConfig:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/", "/registration").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService)
                .passwordEncoder(NoOpPasswordEncoder.getInstance());
    }

用户实体:

@Entity
@Getter
@Setter
@ToString
@EqualsAndHashCode(of = "id")
public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String username;
    private String password;
    @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
    @Enumerated(EnumType.STRING)
    Set<Role> roles;
    ...constructors
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return getRoles();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

控制器:

    @GetMapping("/registration")
    public String registration(){

        return "registration";
    }
    @PostMapping("/registration")
    public String addUser(User user, Map<String, Object> model) {
        User userFromDb = userRepository.findByUsername(user.getUsername());
        if (userFromDb != null) {
            model.put("message", "User exists!");
            return "registration";
        }
        user.setRoles(Collections.singleton(Role.USER));
        userRepository.save(user);

        return "redirect:/login";

百里香叶:你好:

<form th:action="@{/logout}" method="post">
    <input type="submit" value="Sign Out"/>
</form>

登录:

<div th:if="${param.error}">
    Invalid username and password.
</div>
<div th:if="${param.logout}">
    You have been logged out.
</div>
<form th:action="@{/login}" method="post">
    <div><label> User Name : <input type="text" name="username"/> </label></div>
    <div><label> Password: <input type="password" name="password"/> </label></div>
    <div><input type="submit" value="Sign In"/></div>
</form>

注册:

html prettyprint-override"><form action="/login" method="post">
    <div><label>User Name: <input type="text" name="username"></label></div>
    <div><label>Password: <input type="text" name="username"></label></div>
    <div><input type="submit" value="Sign in"></div>
</form>
<a href="/registration">Add new User</a>

我不知道我必须在哪里修复(在表单的前端或后端)我的注册表单到底是怎么回事,我如何添加“保存用户”?

如果可能的话,我想知道,百里香叶/自由制造者/小胡子的差异是什么,我必须使用哪一个?

共有1个答案

滕项明
2023-03-14
//Register Mapping
@RequestMapping(value = "/registerUser", method = RequestMethod.POST)
    public String registerPage(Registration reg,HttpSession session) {
      RegisterUser exitingUser = service.findUserByEmail(reg.getEmail());
      if (exitingUser == null) {
          RegisterUser user = new RegisterUser ();
          user.setEmail(reg.getEmail());
          user.setPass(reg.getPass());
          service.registerNewUserAccount(user); 

      }
    }

// User Model
public class User extends BasicEntity {

        /** */
        private static final long serialVersionUID = 1L;

        @ValidEmail
        @Column(name = "EMAIL_ID", nullable = false)
        private String email_id;

        @Column(name = "PASSWORD", length = 60, nullable = false)
        private String password;

        @Column(name = "ENABLED")
        private boolean enabled;

        @OneToMany(mappedBy = "user", cascade = { CascadeType.ALL })
        private Set<Privilege> privileges;

        @Transient
        private String matchingPassword;

        @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
        @JoinTable(name = "USER_DETAILS_ROLE", joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID"))
        private Set<Role> roles;


        public RegistrationDetails() {
            super();
            this.enabled = false;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getPass() {
            return pass;
        }

        public void setPass(String pass) {
            this.pass = pass;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }

        public String getMatchingPassword() {
            return matchingPassword;
        }

        public void setMatchingPassword(String matchingPassword) {
            this.matchingPassword = matchingPassword;
        }

        @JsonIgnore
        public Set<Role> getRoles() {
            return roles;
        }

        public void setRoles(Set<Role> roles) {
            this.roles = roles;
        }



        @JsonIgnore
        public Set<Privilege> getPermissions() {
            return privileges;
        }

        public void setPermissions(Set<Privilege> privileges) {
            this.privileges= privileges;
        }

        public static long getSerialversionuid() {
            return serialVersionUID;
        }

        public Collection<? extends GrantedAuthority> getAuthorities(Collection<Role> roles) {
            List<String> userRole = new ArrayList<String>();
            for (Role role : roles) {
                userRole.add(role.getName());
            }
            return getGrantedAuthorities(userRole);
        }

        private List<GrantedAuthority> getGrantedAuthorities(List<String> privileges) {
            List<GrantedAuthority> authorities = new ArrayList<>();
            for (String privilege : privileges) {
                authorities.add(new SimpleGrantedAuthority(privilege));
            }
            return authorities;
        }


//security config

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/","/resources/**", "/**").permitAll().anyRequest().authenticated().and().formLogin()
                .loginPage("/").permitAll().usernameParameter("username").passwordParameter("password")
                .loginProcessingUrl("/j_spring_security_check").failureUrl("/")
                .successHandler(authenticationSuccessHandler()).and().logout().logoutSuccessUrl("/")
                .logoutUrl("/logout").invalidateHttpSession(true).deleteCookies("JSESSIONID").and().csrf().disable().headers().frameOptions().sameOrigin();
    }

    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService);
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

    @Bean
    public AuthenticationSuccessHandler authenticationSuccessHandler() {
        return new AuthenticationSuccessHandler();
    }



    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(11);
    }

希望这对你有帮助

 类似资料:
  • 问题内容: 我想保存额外的信息,然后再将总订单发送到Paypal。对于每一项,我都在MySQL数据库中创建了一个要存储的列。现在,我正在考虑将其保存为一个数组,以后可以在创建PHP页面时阅读。多余的字段取自输入表单字段。 通过使用数组,可以确保不混淆信息吗? 问题答案: 您可以使用/ 存储数组。使用该解决方案,它们不能轻易地从其他编程语言中使用,因此您可以考虑使用/ 代替(它为您提供了广泛支持的格

  • 问题内容: 我的客户在php + mysql中创建了一个脚本,该脚本将图像直接保存在数据库中,并且每个图像都有这样的url:www.example.com/image.php?id=421 您认为这是一个非常错误的解决方案?我应该重建所有站点吗? 每天大约有1000次访问,数据库中大约有600张图像。 问题答案: 图像文件是文件,除非有充分的理由将它们存储在数据库中,否则它们应属于文件系统,在文件

  • 我面临着使用Spring数据JPA存储库将数据保存到数据库的问题。 我的场景是:我使用循环逐个收集和保存数据。收集所有数据需要很多时间。因此,我想将每个记录的数据立即保存到表中并保存到数据库中。我正在使用saveAndFlush方法,但数据并没有立即保存到表中。 我迫不及待地要收集所有数据,因为收集所有数据可能需要一整天。

  • 这是使用PHP将数据从(HTML)表单保存到MySQL数据库的规范问答。 如果您正在尝试执行以下操作,则此操作适用于您: 接受HTML表单上的用户输入 使用PHP脚本处理输入 将所述输入存储到MySQL数据库中。 过去提出的不应使用的类似问题的例子: 连接PHP代码并将表单提交到mySQL数据库 使用PHP/html表单插入mySQL-不工作 如何使用PHP将html表单数据传递到mySQL db

  • 问题内容: 我有一个模型对象,我想要一个带有日期的字段。目前,我正在使用适合我们需求的产品。 Hibernate将该字段以形式存储在数据库中。我们可以将其在数据库中的保存方式更改为更易读的格式,更重要的是将其更改为可排序的格式吗? 使用的数据库是mysql db。 问题答案: 这个问题已经解决了作为一种新的改进来 ,原来这是一个孤立的捆绑模块 现在,它直接捆绑,所以只要确保你使用的是最新的版本,它

  • 我有一个模型对象,我想在其中有一个带日期的字段。目前,我使用来满足我们的需要。 所使用的数据库是一个mysql数据库。