Spring Security/Veer Boot – Hoe zijn de ROLLEN voor gebruikers

Wanneer ik ingelogd met behulp van de veiligheid, ik kan geen gebruik maken van de request.isUserInRole() methode. Ik denk dat de rollen van de gebruikers is niet ingesteld.

Dit is mijn Beveiliging:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled=true)
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter  {

@Autowired
private DataSource dataSource;

@Autowired
private UserDetailsServiceImplementation userDetailsService;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers("/signup").permitAll()
            .antMatchers("/").permitAll()
            //.antMatchers("/first").hasAuthority("Service_Center")
            .antMatchers("/login").permitAll()
            .anyRequest().fullyAuthenticated()
    .and().formLogin()
            .loginPage("/login")
            .usernameParameter("email")
            .passwordParameter("password")
            .defaultSuccessUrl("/default")
            .failureUrl("/login?error").permitAll()
    .and().logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .logoutSuccessUrl("/login?logout")
            .deleteCookies("JSESSIONID")
            .invalidateHttpSession(true).permitAll();
}

@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth)
        throws Exception {
    auth.userDetailsService(userDetailsService);

}

}

Dit is mijn User entiteit:

 @Entity
 @Table(name="user")
 public class User  implements Serializable{
/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="user_id")
private Long userID;

@Column(name="email_address", nullable = false, unique = true)
private String emailAddress;

@Column(name="password")
private String password;

@Column(name = "role", nullable = false)
@Enumerated(EnumType.STRING)
private Role role;

public User() {
    super();
}

public User(String emailAddress, String password) {
    this.emailAddress = emailAddress;
    this.password = password;
}

public Long getUserID() {
    return userID;
}

public void setUserID(Long userID) {
    this.userID = userID;
}

public String getEmailAddress() {
    return emailAddress;
}

public void setEmailAddress(String emailAddress) {
    this.emailAddress = emailAddress;
}

public String getPassword() {
    return password;
}

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

public Role getRole() {
    return role;
}

public void setRole(Role role) {
    this.role = role;
}

@Override
public String toString() {
    return "User [userID=" + userID + ", emailAddress=" + emailAddress
            + ", password=" + password + ", role=" + role + "]";
}

public UserDetails toCurrentUserDetails() {
    return CurrentUserDetails.create(this);
}
}

Dit is mijn enum Role:

public enum Role {

Fleet_Company, Service_Center, Admin

}

Dit is mijn UserDetailsServiceImplementation:

@Component
public class UserDetailsServiceImplementation implements UserDetailsService    {

@Autowired
private UserRepository userRepository;

@Override
public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException {
    if ( username == null || username.isEmpty() ){
        throw new UsernameNotFoundException("username is empty");
    }

    User foundUser = userRepository.findByEmailAddress(username);
    if( foundUser != null ){
        System.out.println("FOUND");
        return foundUser.toCurrentUserDetails();

    }
    throw new UsernameNotFoundException( username + "is not found");
}
}

Dit is de klasse die de werktuigen UserDetails:

public class CurrentUserDetails implements UserDetails {
private Long userID;
private String emailAddress;
private String password;
private Role role;


public CurrentUserDetails(Long userID, String emailAddress, String password, Role role) {
    super();
    this.userID = userID;
    this.emailAddress = emailAddress;
    this.password = password;
    this.role = role;
}


  /*    public static UserDetails create(Users entity) {
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    for(Authorities auth: entity.getAuthorities()){
        authorities.add(new SimpleGrantedAuthority(auth.getId().getAuthority()));
    }
    return new MyUserDetail(entity.getUserId(), entity.getLoginId(), entity.getPassword(), entity.getDisplayName(), authorities);
}*/



public Long getUserID(){
    return this.userID;
}


public Role getRole(){
    return this.role;
}




@Override
public String getPassword() {
    return this.password;
}


public String getEmailAddress() {
    return this.emailAddress;
}


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

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


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


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

public static UserDetails create(User entity) {
    System.out.println(entity.getUserID()+ entity.getEmailAddress()+ entity.getPassword()+ entity.getRole());
    return new CurrentUserDetails(entity.getUserID(), entity.getEmailAddress(), entity.getPassword(), entity.getRole());
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    //TODO Auto-generated method stub
    return null;
}

@Override
public String getUsername() {
    //TODO Auto-generated method stub
    return null;
}
}

Dus in principe kunnen wij zien, dat ik slechts één tabel in mijn MySQL database, het heeft vier kolommen en één van hen is ‘de rol’.

Maar net als wat ik zei, als ik request.isUserInRole("Service_Center"), het resultaat FALSE. En .antMatchers("/first").hasAuthority("Service_Center") ook niet werkt.

  • wat is de UserDetailsServiceImplementation? Ik geloof dat de plaats die link moet uw onderneming aan het verzoek van de hoofdsom.
  • Ok, dus het traceren van het probleem leidt tot CurrentUserDetails.create(this). Wat doet die?
  • dat was de klasse implementeert UserDetails. Ik bewerkte mijn post. Je ziet het nu. Dat is in principe alles van mijn Lente-Beveiliging.
  • U dient het rollen via getAuthorities()stackoverflow.com/questions/19525380/… – de lente niet naar uw eigen getRole methode.
  • Wordt automatisch ingesteld via getAuthorities()?
InformationsquelleAutor Lester | 2016-06-03

 

3 Replies
  1. 13

    Die je in moet vullen in de inhoud van de rol door jezelf bij het maken van uw UserDetails:

    public class SecurityUser implements UserDetails{
        String ROLE_PREFIX = "ROLE_";
    
        String userName;
        String password;
        String role;
    
        public SecurityUser(String username, String password, String role){
            this.userName = username;
            this.password = password;
            this.role = role;
        }
    
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
    
            list.add(new SimpleGrantedAuthority(ROLE_PREFIX + role));
    
            return list;
        }

    Wat u hoeft te doen is negeren methode: getAuthorities, en vul de inhoud van uw rol in het veld in de GrantedAuthority lijst.

    • het toevoegen van nieuwe Rol op getAuthorities methode? Ziet er niet zo een goed idee… moet U gebruik maken van SecurityContextHolder en doe het in een aparte service.
    • Moet de rol bevatten ROLE_ prefix? En als de rol is ROLE_ADMIN hasRole moeten opgeven ‘ADMIN’ of ‘ROLE_ADMIN’?
  2. 2

    Wat Divelnto, zapl en thorinkor zei is goed. Maar de vraag zou moeten zijn over de “Rol” en NIET “Rollen”. OF, als u gebruikers en rollen in één tabel, zijn een slecht ontwerp. Misschien wilt u een nieuwe look aan uw ontwerpen. U moet beschikken over een aparte rol entiteit. En in uw UserService je iets kunnen doen als:

    AppUser user = userRepository.findByUsername(username);
    
    Set<GrantedAuthority> grantedAuthorities = new HashSet<>(); //use list if you wish
    for (AppRole role : user.getRoles()) {
        grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
    }
    return new org.springframework.security.core.userdetails.User(
            user.getUsername(),
            user.getPassword(),
            grantedAuthorities
    );

    Monsters: monster 1 sample2 sample3

    In DB, kunt u de naam van de rol als (bijv.) ADMIN/EDITOR/VIEWER in de database of op te slaan rollen als ROLE_ADMIN/ROLE_… dan je zou willen gebruiken hasRole/hasAuthoriy. Hoop dat het helpt.

    Voor referentie, neem een kijkje hier:

    Spring Security Gerelateerde 1

    Spring Security Gerelateerde 2

    • U zei dat het slecht is ontwerp om gebruikers en rollen in één entiteit, maar je voorbeeld code lijkt precies dat te doen… ik denk dat het eenvoudiger is om ze samen als uw DB kan dat.
    • Begrijp me niet verkeerd bud.! Zie je een “kolom” – “rol” in elk van de Gebruiker entiteiten in de monsters? Ook als een Gebruiker wordt verondersteld te beschikken over slechts één rol, waarom moet je een rol in de eerste plaats? Het is een loon-idee. In plaats van het gebruik van “rol” (en niet “rollen”) kunt u een vlag als true/false met if-else-voorwaarde dat zal het oplossen van het doel In Mijn Nederige Opinie. Bedankt.
  3. 1

    Voor het toevoegen van Rollen je nodig hebt om een tabel met de gebruikersnaam en het bijbehorende rol.

    Stel dat een gebruiker heeft twee rollen, namelijk, BEHEERDER en GEBRUIKER

    Een Gebruiker kan meerdere rollen.

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        final List<SimpleGrantedAuthority> authorities = new LinkedList<>();
        if (enabled) {
            if (this.getUser().isAdmin()) {
                authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
            }
            authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
        }
            return authorities;
    }

    Dit kan worden genoemd,

    private UsernamePasswordAuthenticationToken getAuthentication(
    final String token, final HttpServletRequest req,
    final HttpServletResponse res){
        return new UsernamePasswordAuthenticationToken(userAccount, null,
        userAccount.getAuthorities());
    }

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *