2017-07-03 6 views
0

ich Spring-Security bin mit Anfragen an Authentifizieren des unter bean mit:Abrufen von Daten aus jdbcTemplate in springsecurity

<authentication-manager> 
    <authentication-provider> 
     <password-encoder hash="sha" /> 
     <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password, enabled from users where username=?" authorities-by-username-query="select u.username, a.authority from users u, authorities a where u.username = a.username and u.username =?" /> 
    </authentication-provider> 
</authentication-manager> 

würde ich die Daten in der user Tabelle, in einem gewissen Punkt, wie Boot-Up-Anwendung abrufen möge.

Hier ist die Bean, die die respektierte Datenbank aus MySQL extrahieren soll. Die Datenbank ist Setup erfolgreich:

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 

    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/bank" /> 
    <property name="username" value="root" /> 
    <property name="password" value="" /> 
</bean> 

Und am Ende habe ich die jdbcTemplate wie folgt:

public class JdbcUserDAO implements UserDAO{ 

    private DataSource dataSource; 
    private JdbcTemplate jdbcTemplate; 

    @Resource(name="dataSource") 
    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
     setJdbcTemplateDataSource(); 
    } 

    private void setJdbcTemplateDataSource() { 
     jdbcTemplate = new JdbcTemplate(dataSource);  
    } 
} 

Die Frage ist, , wie ich die Aufzeichnungen von Benutzertabelle abrufen kann?. Ich habe this question gesehen, und ich bin nicht mit der Antwort überzeugt. Selbst wenn das Datenquellen-Bean einmal (als Singleton) erstellt wird, sollte es möglich sein, es mindestens einmal zu replizieren.

Der vollständige Code ist here, und ist das Datenbankschema.

Was will ich genau sehen, ist das Ergebnis der folgenden Abfragen:

select username, password, enabled 
from users 
where username = ? 

select u.username, a.authority 
from users u, authorities a 
where u.username = a.username and u.username =? 
+0

[Schlechte Gewohnheiten zu treten: mit alten sty le JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - dieses altmodische * Komma getrennte Liste von Tabellen * Stil wurde durch die * richtige * ANSI 'JOIN' Syntax im ANSI - ** 92 ** SQL Standard ersetzt (** 25 Jahre ** vor!) und es wird davon abgeraten –

Antwort

1

Wenn ich richtig verstehe Sie nur testen wollen DataSource, für dieses Ziel können Sie einfache Integrationstest schreiben

Sie haben mehrere Möglichkeiten:

  • , wenn Sie zum Beispiel Ruhe Service schreiben Sie MockMvc für den Test verwenden, wie Sie Ihre Authentifizierung arbeiten, s omething wie diese

    mockMvc.perform(post("/api/path/") 
         .principal(principal) 
         .content(this.json(someObject)) 
         .contentType(contentType)) 
         .andExpect(status().isOk()); 
    

    und setzen Anmerkung @WithMockUser(roles = "SOME_ROLE", password = "test", username = "[email protected]") vor dem Test.

  • können Sie auch Test schreiben, wo Sie gerade Ihre DataSource injizieren und versuchen Abfrage zu machen, die Sie in DataSource Definition schrieb

ich vielleicht nicht sicher, ob es Gelegenheit ist AuthenticationProvider zu testen ich dies überprüfen, wird

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("path to your config") 
public class Test{ 

@Autowired 
@Qualifier("beanName")//should work without this, too 
public DataSource ds; 

@Test 
public void test(){ 
    Conection con = null; 
    Statement stmt = null; 
    ResultSet rs = null; 

    try { 
     con = ds.getConnection(); 
     stmt = con.createStatement(); 
     rs = stmt.executeQuery("your query"); 

     while(rs.next()) { 
      //assert or something else 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } finally { 
      try { 
       if(rs != null) rs.close(); 
       if(stmt != null) stmt.close(); 
       if(con != null) con.close(); 
      } catch (SQLException e) { 
       // 
      } 
    } 
} 

und fügen Sie diese zu Ihrer Konfigurations <context:annotation-config/>

+0

Es ist eine gute Idee, Aber kannst du etwas Code hinzufügen und mehr Erklärung? – Salman

+0

Sie wollen Beispiel zur vollständigen Authentifizierung oder einfache Abfrage zu db? – Jungle

+0

Die Frage wird jetzt aktualisiert – Salman