2014-05-22 42 views
1

我正在開發一個帶有struts2,hibernate和spring的應用程序。 我正在嘗試整合spring安全性。 這是我springSecurity.xml:使用數據庫中的數據整合彈簧安全

<security:http auto-config="true" use-expressions="true"> 
    <security:intercept-url pattern="/welcome" 
     access="permitAll" /> 
    <security:form-login login-page="/login/formLogin" 
     default-target-url="/login/welcome" 
     authentication-failure-url="/login/formLogin?login_error=1" 
     username-parameter="username" 
     password-parameter="password" /> 
    <security:logout /> 
</security:http> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider> 
     <security:jdbc-user-service data-source-ref="datasource" 
     users-by-username-query= 
     "select id, Rol_id, email, motDePasse from user u where u.email=?" 
     authorities-by-username-query= 
     "select u.email,r.role from user u, role r where u.Rol_id=r.id and u.email=?" 
     /> 
    </security:authentication-provider> 
</security:authentication-manager> 

表用戶和角色:

CREATE TABLE IF NOT EXISTS `role` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`role` varchar(254) DEFAULT NULL, 
`description` varchar(254) DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`Rol_id` int(11) NOT NULL, 
`email` varchar(254) DEFAULT NULL, 
`motDePasse` varchar(254) DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `FK_Association_user_role` (`Rol_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

的login.jsp

<form name='loginForm' 
    action="${pageContext.request.contextPath}/j_spring_security_check" 
    method='POST'> 

    <table> 
     <tr> 
      <td>User:</td> 
      <td><input type='text' name='username' value=''></td> 
     </tr> 
     <tr> 
      <td>Password:</td> 
      <td><input type='password' name='password' /></td> 
     </tr> 
     <tr> 
      <td><input name="submit" type="submit" value="submit" /></td> 
     </tr> 
    </table> 

    <input type="hidden" name="${_csrf.parameterName}" 
     value="${_csrf.token}" /> 

</form> 

的問題如下:

即使我提供正確的用戶名和密碼,我收到「Bad credentials」。 任何幫助表示讚賞!

+0

你的查詢是錯誤的,'用戶s-by-username-query'必須返回3個代表'username','password'和'enabled'的字段,它們應該分別是'String','String'和'boolean'。然而,你返回更多的領域,顯然第三不是'boolean'。 –

+0

首先,感謝回覆, 是否意味着我的表格必須尊重這個模式? – user3604388

+0

對不起,但我是一個初學者與彈簧安全 – user3604388

回答

0

它看起來像配置中的SQL不正確。

「用戶按用戶名查詢」屬性應具有以下SQL模式

Select email, motDePasse, enabled from user where email= ? 

如果不啓用您的表列中,您可以如下返回true

Select email, motDePasse, 'true' from user where email= ? 

「部門按用戶名查詢」屬性應具有以下SQL模式

Select user.email, role.role from role join user on role.id=user.Rol_id where user.email=? 
+0

謝謝!你的答案非常有用。 現在我想獲取我的用戶詳細信息並將此對象設置爲會話對象。 我正在使用struts2我該怎麼辦 – user3604388

+0

是你現在解決的原始問題? – Kalyan

+0

是的,我按照你的回答解決了這個問題 – user3604388