【问题标题】:input validation against DB in Spring+hibernate在 Spring+hibernate 中对 DB 进行输入验证
【发布时间】:2017-03-19 13:49:18
【问题描述】:

它带有 Hibernate 的 Spring MVC 应用程序。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserDao userDao;
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public boolean save(User user) {

        return userDao.save(user);
    }

    @Override
    public void update(User user) {

        userDao.update(user);

        // return this.userDao.update(user);
    }

    @Override
    @Transactional
    public User findById(int id) {

        return this.userDao.findById(id);
    }

    @Override
    @Transactional
    public List<User> listPersons() {

        return this.userDao.listPersons();
    }

    @Override
    @Transactional
    public User deleteUser(int id) {

        return userDao.deleteUser(id);
    }

    public boolean validateUser(int id) {

        List<User> list= (List<User>) findById(id); 


        return false;   


    }

    public User validateUser(User user) {   

        Session session = this.sessionFactory.getCurrentSession();

        String query = "select u.name, u.password from User as u where u.name='"+ user.getName() + "' and u.password='"
                + user.getPassword() + "'";

        session.createQuery(query);       

        ResultSet rs = (ResultSet) session.createQuery (query);

            try {
                if (rs.next()){

                    return user;
                } else
                    return user;
            } catch (SQLException e) {

                e.printStackTrace();
            }
            return user;

        }
}
My UserServiceImpl class has a method to validate the user input[ password and userID];

用户登录到 login.jsp 页面并填写此表单:

<body>

    Welcome back!

    <br> Only Registered user can log in...
    <br>
    <br>
    <form:form action="admin" modelAttribute="user" method="POST">
        <table border="1">

            <tr>
                <td><form:label path="userId">Your Id:- </form:label></td>
                <td><form:input path="userId" /></td>
            </tr>
            <tr>
                <td><form:label path="password">Password:- </form:label></td>
                <td><form:input path="password" /></td>
            </tr>

            <tr>
                <td><form:label path="role">Select Log in role as a:- </form:label></td>
                <td><form:select path="role">
                        <form:option value="NONE" lable="---SELECT---">Please Select</form:option>
                        <form:options items="${roles}" />
                    </form:select></td>
                <td><input type="submit" value="Login" /></td>
            </tr>
        </table>
    </form:form>
</body>

表单进入控制器:

@RequestMapping(value = "/admin", method = RequestMethod.POST)
    public String LoggedUser(@ModelAttribute("user") User user, BindingResult result, Model model) {

        // get the role, id and pw value from jsp
        String role = user.getRole();
        String loadedPW = user.getPassword();
        String loadedUId = user.getUserId();
        // want to check password and userId here again Db
        //loadedPW.

      //directing to admin page and gen page
    if (role.equalsIgnoreCase("Admin") || role.equalsIgnoreCase("Principal")) {
            return "adminPage";         
        } else
            return "genPage";
    }

我的用户对象是

@Entity
@Table(name = "USER")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "USER_ID")
    private String userId;
    @Column(name = "PASSWORD")/*    
    @NotNull(message="Please select a password")
    @Length(min=5, max=10, message="Password should be between 5 - 10 charactes")*/ 
    private String password;

    @Column(name = "EMAIL")
    private String email;

    @Column(name = "ROLE")
    private String role;

    @Column(name = "DEPARTMENT")
    private String department;
    @Column(name = "RID")
    private int rid;    
    public int getRid() {
        return rid;
    }
    public void setRid(int rid) {
        this.rid = rid;
    }   
    @ManyToOne
    @JoinTable(name = "user_roles", joinColumns = {
            @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = {
                    @JoinColumn(name = "roles_id", referencedColumnName = "id") })

    /*@ManyToOne(cascade=CascadeType.ALL)*/
    public Roles roles;

    public Roles getRoles() {
        return roles;
    }
    public void setRoles(Roles roles) {
        this.roles = roles;
    }
    // no arg constructor
    public User() {
//getters and setters ........
    }

如何根据我的用户表验证 login.jsp 上的密码和用户 ID 输入? 我必须使用 JDBC 结果集还是有其他更好的方法来验证用户输入?我正在使用带有 Spring MVC 4.x 的 Hibernate 4.3x。

【问题讨论】:

    标签: spring hibernate validation spring-mvc passwords


    【解决方案1】:

    如何验证 login.jsp 上的密码和用户 ID 输入 我的用户表?

    您可以使用spring-security 模块,它对于验证和授权用户请求(就像在您的网络应用程序中一样)非常强大,您可以找到一个示例here

    spring-security 模块提供了各种方法来配置用户详细信息,如内存、数据库、LDAP 等,但对于您的情况,您需要使用 (AuthenticationManagerBuilder.jdbcAuthentication()) 进行 JDBC 身份验证。

    方法是你需要通过覆盖WebSecurityConfigurerAdapter的方法configAuthentication()和configure()方法来提供一个配置类

    我必须使用 JDBC 结果集还是有其他更好的方法 验证用户输入?

    不,您不需要直接处理 JDBC Resultset,而是在 spring-security 中,您只需要提供 datasource(数据库访问详细信息)和 sql 查询,如 select username,password from users where username=?

    您可以参考here配置JDBC认证。

    【讨论】:

    • Spring security 不会去远程数据库进行密码验证,而是将用户名/密码组合存储在配置文件本身中。但我希望它更像实时应用程序,其中一些用户服务从远程数据库获取数据。
    • 不,你需要配置远程数据库主机名、端口、数据库名、用户ID、密码作为数据源属性的一部分,就是这样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2018-06-20
    • 2021-07-18
    • 2020-09-25
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多