这是我的问题 - 我使用Spring Security授权用户,但我只能登录一个用户(测试)。我创建的另一个用户(通过网站或手动在db中无法工作)。 db是MySQL,spring security 3.2.6.RELEASE。
安全context.xml中:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<http auto-config="true" use-expressions="true">
<form-login login-page="/"
default-target-url="/"
authentication-failure-url="/error"
username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/" delete-cookies="JSESSIONID" invalidate-session="true" /> <!-- określamy przekierowanie po wylogowaniu -->
<!-- <csrf /> włączamy zabezpieczenie przed csrf -->
<intercept-url pattern="/addnew" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" />
</http>
<authentication-manager>
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="SELECT login, pass, mail FROM user WHERE login =?"
authorities-by-username-query="SELECT login, role FROM roles WHERE login =?" />
</authentication-provider>
</authentication-manager>
<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url" value="jdbc:mysql://localhost:3306/usersdb" />
<beans:property name="username" value="root" />
<beans:property name="password" value="1234" />
</beans:bean>
</beans:beans>
负责登录的.jsp代码块:
<c:set var="sign">
<c:url value="/j_spring_security_check" />
</c:set>
<form class="navbar-form navbar right" action="${sign}" method="POST">
<div class="form-group">
<input type="text" class="form-control" name="username"
placeholder="Username">
</div>
<div class="form-group">
<input type="password" class="form-control" name="password" placeholder="Password">
</div>
<button type="submit" class="btn btn-default" name="action">Sign In</button>
</form>
Db连接正确,因为当我在db中手动更改密码时,测试&#39;用户,我需要用neew密码登录。这是用户类,但我不认为它是相关的:
package com.codedig.app;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity //deklaruje, ze mamy do czynienia z encja
public class User {
//niezalenize czy istnieja gettery/settery (akcesory) wszystkie wlasnosci obiektu sa zapisywane do bd
@Id //deklaruje klucz wg. którego rozrozniamy encje
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "id")
private int id;
@Column(name = "login")
private String login;
@Column(name = "pass")
private String pass;
@Column(name = "mail")
private String mail;
public User() {
super();
}
public User(int id, String login, String pass, String mail) {
super();
this.id = id;
this.login = login;
this.pass = pass;
this.mail = mail;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
}
编辑:权限用户名查询可能看起来有点乱,但我有3&gt; 2索引的问题(如果我没记错的话 - 如果你知道查询应该是什么样子 - 请不要犹豫指出)。
答案 0 :(得分:1)
这不是正常的答案,但我认为指向了正确的方向 - 我忘了启用&#39;领域。将它添加到db并将其映射到User类之后,它仍然无法正常工作(令人惊讶),但问题可能是,我在这个项目中使用hibernate来处理另一个db。我要将我的项目改为完全使用hibernate,这应该可以解决它。
答案 1 :(得分:0)
确保每个用户至少有一个角色。如果用户没有角色,Spring Security将拒绝登录。