2017-10-09 128 views
0

我想創建一個角色用戶登錄。所以我仍然困惑於如何創建用戶角色和角色用戶登錄。我做了如下一些源代碼:如何創建角色用戶登錄?

User.java:

package com.practice.login.entity; 

import javax.persistence.*; 
import java.util.Set; 

@Entity 
@Table(name = "user") 
public class User { 
    private Long id; 
    private String username; 
    private String password; 
    private String passwordConfirm; 
    private Set<Role> roles; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long idUser) { 
     this.id = idUser; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @Transient 
    public String getPasswordConfirm() { 
     return passwordConfirm; 
    } 

    public void setPasswordConfirm(String passwordConfirm) { 
     this.passwordConfirm = passwordConfirm; 
    } 

    @ManyToMany 
    @JoinTable(
      name = "user_role", 
      joinColumns = @JoinColumn(
        name = "user_id"), 
      inverseJoinColumns = @JoinColumn(
        name = "role_id")) 
    public Set<Role> getRoles() { 
     return roles; 
    } 

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

Role.java

package com.practice.login.entity; 

import javax.persistence.*; 
import java.util.Set; 

@Entity 
@Table(name = "role") 
public class Role { 
    private Long id; 
    private String name; 
    private Set<User> users; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @ManyToMany(mappedBy = "roles") 
    public Set<User> getUsers() { 
     return users; 
    } 

    public void setUsers(Set<User> users) { 
     this.users = users; 
    } 
} 

UserService.java:

package com.practice.login.service; 

import com.practice.login.entity.User; 

public interface UserService { 

    void save(User user); 

    User findByUsername(String username); 

} 

UserServiceImpl.java

package com.practice.login.service; 

import com.practice.login.entity.User; 
import com.practice.login.repository.RoleRepository; 
import com.practice.login.repository.UserRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 
import org.springframework.stereotype.Service; 

import java.util.HashSet; 

@Service 
public class UserServiceImpl implements UserService { 
    @Autowired 
    private UserRepository userRepository; 
    @Autowired 
    private RoleRepository roleRepository; 
    @Autowired 
    private BCryptPasswordEncoder bCryptPasswordEncoder; 

    @Override 
    public void save(User user) { 
     user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); 
     user.setRoles(new HashSet<>(roleRepository.findAll())); 
     userRepository.save(user); 
    } 

    @Override 
    public User findByUsername(String username) { 
     return userRepository.findByUsername(username); 
    } 
} 

UserDetailServiceImpl.java

package com.practice.login.service; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.SimpleGrantedAuthority; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.practice.login.entity.Role; 
import com.practice.login.entity.User; 
import com.practice.login.repository.UserRepository; 

import java.util.HashSet; 
import java.util.Set; 

@Service 
public class UserDetailsServiceImpl implements UserDetailsService { 
    @Autowired 
    private UserRepository userRepository; 

    @Override 
    @Transactional(readOnly = true) 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     User user = userRepository.findByUsername(username); 
     Set<GrantedAuthority> grantedAuthorities = new HashSet<>(); 
     for (Role role : user.getRoles()) { 
      grantedAuthorities.add(new SimpleGrantedAuthority(role.getName())); 
     } 

     return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), 
       grantedAuthorities); 
    } 
} 

UserRepository.java

package com.practice.login.repository; 

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.stereotype.Repository; 

import com.practice.login.entity.User; 

@Repository 
public interface UserRepository extends JpaRepository<User, Long> { 
    User findByUsername(String username); 
} 

RoleRepository.java

package com.practice.login.repository; 

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.stereotype.Repository; 

import com.practice.login.entity.Role; 

@Repository 
public interface RoleRepository extends JpaRepository<Role, Long> { 
} 

如何與角色的privilages登錄?

回答

0

這主要取決於你的HttpSecurity配置:

例SecurityConfig.java:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     // @formatter:off 
     http 
      .csrf().disable() 
      .authorizeRequests() 
      .antMatchers("/login*", "/logout*").permitAll() 
      .antMatchers("/user/updatePassword*", "/user/savePassword*").hasRole("ROLE_USER") 
      .antMatchers("/admin/**").hasRole("ROLE_ADMIN") 
      .and() 
      .formLogin() 
      .loginPage("/login") 
      .defaultSuccessUrl("/homepage.html") 
      .permitAll() 
      .and() 
      .logout() 
      .logoutSuccessUrl("/logout.html") 
      .permitAll(); 
     // @formatter:on 
    } 

} 
+0

感謝主席先生,我可以在下面使用的代碼? –