只有一个用户可访问弹簧安全

时间:2015-04-03 14:02:47

标签: java mysql spring-mvc spring-security

这是我的问题 - 我使用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索引的问题(如果我没记错的话 - 如果你知道查询应该是什么样子 - 请不要犹豫指出)。

2 个答案:

答案 0 :(得分:1)

这不是正常的答案,但我认为指向了正确的方向 - 我忘了启用&#39;领域。将它添加到db并将其映射到User类之后,它仍然无法正常工作(令人惊讶),但问题可能是,我在这个项目中使用hibernate来处理另一个db。我要将我的项目改为完全使用hibernate,这应该可以解决它。

答案 1 :(得分:0)

确保每个用户至少有一个角色。如果用户没有角色,Spring Security将拒绝登录。