使用Spring Boot Rest API的mysql身份验证问题

时间:2019-08-10 16:54:59

标签: java mysql spring-boot authentication

我通过spring boot rest api对mysql进行身份验证。 我想使用'saveUser'方法从服务中自己创建一个用户,并访问此用户信息和rest api。在不使用任何mvc结构(例如html,js,css)的情况下,我想使用该服务创建一个用户,然后使用该用户登录以使用api。我在下面提到了该项目的所有单元。 如果您有帮助,我将不胜感激。

用户

@Data
@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private int id;
    @Column(name = "email")
    @Email
    @NotEmpty
    private String email;
    @Column(name = "password")
    @Length(min = 5)
    @NotEmpty
    private String password;
    @Column(name = "name")
    @NotEmpty
    private String name;
    @Column(name = "last_name")
    @NotEmpty
    private String lastName;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    //G&S
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public Set<Role> getRoles() {
        return roles;
    }
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

}

角色

@Data
@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "role_id")
    private int id;
    @Column(name = "role")
    private String role;

    //G&S
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }

}

UserRepository

public interface UserRepository extends JpaRepository<User, Integer>{
    User findByEmail(String email);
    List<User> findByName(String name);
    List<User> findByLastName(String lastName);
}

角色存储库

public interface RoleRepository extends JpaRepository<Role, Integer>{
    Role findByRole(String role);
}

服务

@org.springframework.stereotype.Service
public class UserService {
    @Autowired
    UserRepository userRepository;
    @Autowired
    RoleRepository roleRepository;

    @Autowired
    public UserService(UserRepository userRepository,
                       RoleRepository roleRepository) {

        this.userRepository = userRepository;
        this.roleRepository = roleRepository;
    }

    //CREATE USER
    public User saveUser(User user) {
        user.setPassword("mutlu1234");
        Role userRole = roleRepository.findByRole("ADMIN");
        user.setRoles(new HashSet<Role>(Arrays.asList(userRole)));
        return userRepository.save(user);
    }

}

MainController

@Controller
public class MainController {

    @Autowired
    UserService userService;


    @RequestMapping(value="/", method = RequestMethod.GET)
    public String createUser() {

        User mutlu = new User();
        userService.saveUser(mutlu);

        return "Created";
    }

    @RequestMapping(value = "/private/{accountNumber}")
    public String getPrivateAccountData(@PathVariable final int accountNumber){
        return "Private account lined:"+accountNumber;
    } 

}

配置

public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Autowired
    private DataSource dataSource;

    @Override
    public void configure(HttpSecurity httpSecurity) throws Exception{
        httpSecurity.authorizeRequests().antMatchers("/private/*").hasRole("ADMIN").and().formLogin();
    }

    @Autowired
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.
        jdbcAuthentication()
        .dataSource(dataSource)
        .usersByUsernameQuery("select email, password from users where email=?")
        .authoritiesByUsernameQuery("select u.email, r.role from users u inner join user_role ur on(u.user_id=ur.user_id) inner join role r on(ur.role_id=r.role_id) where u.email=?")
        .dataSource(dataSource);

    }
}
资源中的

data.sql

REPLACE INTO `role` VALUES (1,'ADMIN');
REPLACE INTO `role` VALUES (2,'USER');

应用程序属性

server.port=8090
spring.datasource.url=jdbc:mysql://localhost:3306/auth?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=Turkey
spring.datasource.username=root
spring.datasource.password=
spring.datasource.initialization-mode=always
spring.jpa.hibernate.ddl-auto=none

1 个答案:

答案 0 :(得分:0)

我认为问题在于“ /”上的get方法。它应该是一种将数据保存到数据库的后期方法。尝试将其更改为post方法。