0

Sorry im Voraus für mein schlechtes Englisch ..Spring Boot mit Spring Security und benutzerdefinierte Datenbank

Da ich meine Datenbankkonfiguration geändert habe, gelingt es mir nicht, mich auf meine Anwendung zu protokollieren. Ich verwende Spring-Sicherheit. Vor den Änderungen hat alles funktioniert.

Ich habe zwei Entitäten:

  • User.java
  • UserRole.java

User.java

package betizy.models; 

//imports 

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


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

@NotNull 
@Column(name = "USE_USERNAME") 
private String username; 

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

@NotNull 
@Column(name = "USE_EMAIL") 
private String email; 


//getters and setters 
} 



UserRole.java

package betizy.models; 

//imports 

@Entity 
@Table(name = "usr_user_role") 
public class UserRole { 

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

@ManyToOne 
@JoinColumn(name = "USR_USE_ID") 
private User user; 

@NotNull 
@Column(name = "USR_ROLE") 
private String role; 

//getters and setters 
} 



login.html

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> 
<head> 
    <title>Spring Security Example </title> 
    <script src="/webjars/angularjs/1.4.9/angular.js"></script> 
    <script src="webjars/jquery/2.0.3/jquery.min.js"></script> 

    <link rel="stylesheet" href="/webjars/bootstrap/3.3.6/css/bootstrap.css"> 

    <script src="/js/index.js"></script> 
</head> 
<body ng-app="Betizy"> 
     <div header></div> 
     <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" required/> </label></div> 
      <div><label> Password: <input type="password" name="password" required/> </label></div> 
      <div><input type="submit" value="Sign In"/></div> 
     </form> 
     <div>To open a new account click <a href="/register">here</a>. </div> 
     <div footer></div> 
</body> 
</html> 



SecurityConfig.java

package betizy.security; 

//imports 

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 


@Autowired 
DataSource dataSource; 

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

    auth.jdbcAuthentication().dataSource(dataSource) 
      //.passwordEncoder(passwordEncoder()) 
      .usersByUsernameQuery(
        "select * from use_user where use_user.use_username=?") 
      .authoritiesByUsernameQuery(
        "select * from usr_user_role inner join use_user on use_user.use_id = usr_user_role.usr_use_id where use_user.use_username=?"); 
} 

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


@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
      //.antMatchers("/hello").access("hasRole('ROLE_ADMIN')") 
      .antMatchers("/", "/register", "/user/create", "/webjars/**", "/js/**").permitAll() 
      .anyRequest().authenticated() 
      .and() 
      .formLogin().loginPage("/login").permitAll() 
      .usernameParameter("username").passwordParameter("password") 
      .and() 
      .logout().permitAll() 
      .and() 
      .exceptionHandling().accessDeniedPage("/403") 
      .and() 
      .csrf().disable(); 
} 
} 



Ich denke Problem mit Namen meiner User Einheit Felder oder meine beiden Abfragen in SecurityConfig.java ist, aber ich habe keine Ahnung, wie kann ich tun, um zu lösen mein Problem.
Ich muss meine Datenbankkonfiguration (Name der Felder) behalten.



Vielen Dank im Voraus für Ihre Hilfe! :)




EDIT

Mit zwei Änderungen auf alle Werke, aber es ist nicht die gute Datenbank. Ich werde nach Unterschiede zwischen den beiden Datenbanken und Unterschiede in SecurityConfig.java

Die erste Basis (es ist Werke)
User table
User Role table

Mit SecurityConfig. java

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

    auth.jdbcAuthentication().dataSource(dataSource) 
      .usersByUsernameQuery(
        "select username,password, enabled from users where username=?") 
      .authoritiesByUsernameQuery(
        "select username, role from user_roles where username=?"); 
} 



Second es funktioniert nicht. Ich kann keine Links, aber Sie haben die perfekte Beschreibung oben in User.java und UserRole.java

Mit SecurityConfig.java

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

    auth.jdbcAuthentication().dataSource(dataSource) 
      .usersByUsernameQuery(
        "select use_username, use_password, use_email from use_user where use_username=?") 
      .authoritiesByUsernameQuery(
        "select use_username, usr_role from usr_user_role, use_user where use_id = usr_use_id and use_username=?"); 
} 
+0

Name meiner Entitäten Felder zum Beispiel. Ich habe diese http://www.raistudies.com/spring-security-tutorial/custom-tables-spring-security/ gefunden, aber ich benutze Spring Boot also wo ist diese Datei? –

+0

Was ist der Fehler, den Sie bekommen? Veröffentlichen Sie die Protokolle. – Jobin

+0

Ich habe keine Protokolle oder Fehler .. Ich weiß nicht warum. –

Antwort

2

Bitte geben Sie die SQL ändern, um die Spalte zurück Namen in Reihenfolge statt *;

<!-- change to your own column name, return the columns in order--> 
select <username,password,enabled> from use_user where use_user.use_username=? 

und AUTHORITIES SQL

<!-- change to your own column name, the authority must be second column --> 
select <username,authority> from usr_user_role inner join use_user on use_user.use_id = usr_user_role.usr_use_id where use_user.use_username=? 

Weitere Einzelheiten siehe here, OK, hier ist der Code, ich denke, es ist viel einfacher zu verstehen, warum Sie die Spalten, um zurückkehren.

protected List<UserDetails> loadUsersByUsername(String username) { 
     return getJdbcTemplate().query(this.usersByUsernameQuery, 
       new String[] { username }, new RowMapper<UserDetails>() { 
        @Override 
        public UserDetails mapRow(ResultSet rs, int rowNum) 
          throws SQLException { 
         // get user info 
         String username = rs.getString(1); 
         String password = rs.getString(2); 
         boolean enabled = rs.getBoolean(3); 
         return new User(username, password, enabled, true, true, true, 
           AuthorityUtils.NO_AUTHORITIES); 
        } 

       }); 
    } 

protected List<GrantedAuthority> loadUserAuthorities(String username) { 
     return getJdbcTemplate().query(this.authoritiesByUsernameQuery, 
       new String[] { username }, new RowMapper<GrantedAuthority>() { 
        @Override 
        public GrantedAuthority mapRow(ResultSet rs, int rowNum) 
          throws SQLException { 
         //get GrantedAuthority 
         String roleName = JdbcDaoImpl.this.rolePrefix + rs.getString(2); 

         return new SimpleGrantedAuthority(roleName); 
        } 
       }); 
    } 
+0

'wählen Sie use_username, use_password , use_email? ', muss die dritte Spalte' enabled'-Spalte sein. oder Sie können Ihren eigenen 'UserDetailsService' anstelle von' JdbcDaoImpl' implementieren – chaoluo

Verwandte Themen