【问题标题】:Custom Data Source Spring MVC Hibernate 3自定义数据源 Spring MVC Hibernate 3
【发布时间】:2013-08-15 16:36:22
【问题描述】:

我正在使用 Hibernate 开发 Spring MVC 应用程序,但我遇到了与数据库的连接问题。

我已经使用org.springframework.jdbc.datasource.DriverManagerDataSource 在我的web.xml 中定义了数据源,并设置了我的应用程序连接到的架构的属性,如下所示:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="${jdbc.driverClassName}"/>  
        <property name="url" value="${jdbc.url}"/>  
        <property name="username" value="${jdbc.username}"/>  
        <property name="password" value="${jdbc.password}"/>  
</bean>

但是,现在我想使用自定义数据源,因为(出于安全原因)我在数据库中有一个带有“连接链”的表,其中包含加密的数据源属性(url、用户名、密码等),所以我不需要在我的 xml 中手动设置属性,只需通过那个“连接链”传递它们。

我不知道我是否让人们感到困惑,但我的英语说得不太好,我完全绝望了。 谢谢和问候。

编辑: 感谢您的快速回复!

抱歉,信息不佳。 好吧,我的应用程序第一次使用通用用户和密码(用户名:“hello”,密码:“hello)连接到数据库中的通用模式,其中放置了一个包含各种应用程序(包括我的应用程序)的“连接链”的表.

该连接链包含用户、密码、url 和 MaxConnections。

再次感谢。

【问题讨论】:

  • 你能澄清一下吗?听起来您想连接到数据库以读取可让您连接到数据库的值。我假设您正在使用多个数据库?
  • 也许这不是您想要的,但如果您想加密您的属性(用户名、密码、url),您可以在属性中执行此操作。使用此处解释的“jasypt”库:wiki.jasig.org/display/CASUM/…
  • @superEb 我已经编辑了我的问题。清楚吗?问我还有什么需要补充的。提前致谢。

标签: hibernate spring-mvc datasource


【解决方案1】:

Spring 包含处理用户、数据库哈希和会话的安全功能。您应该使用安全配置文件中定义的身份验证管理器并创建一个 bean 来处理从表中获取用户。

<beans:bean id="customUserDetailsService"
class="com.program.service.CustomUserDetailsService" />

<authentication-manager>
<authentication-provider user-service-ref="customUserDetailsService" />
</authentication-manager>

然后,您可以按如下方式定义您的用户详细信息服务,以便让您的用户从应该已经配置的数据库中使用 Hibernate 3。

package com.program.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.program.dao.UserDAO;

@Service
@Transactional(readOnly = true)
public class CustomUserDetailsService implements UserDetailsService {

@Autowired
private UserDAO userDAO;

public UserDetails loadUserByUsername(String login)
        throws UsernameNotFoundException {

    com.program.model.User domainUser = userDAO.getUser(login);

    boolean enabled = true;
    boolean accountNonExpired = true;
    boolean credentialsNonExpired = true;
    boolean accountNonLocked = true;

    return new User(domainUser.getUsername(), domainUser.getPassword(),
            enabled, accountNonExpired, credentialsNonExpired,
            accountNonLocked,     getAuthorities(domainUser.getRole().getId()));    //get role id of domain user
}

public Collection<? extends GrantedAuthority> getAuthorities(Integer role) {
    List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(role));
    return authList;
}

public List<String> getRoles(Integer role) {

    List<String> roles = new ArrayList<String>();

    if (role.intValue() == 1) {
        roles.add("ROLE_ADMIN");
    } else if (role.intValue() == 2) {
        roles.add("ROLE_MODERATOR");
    }
    return roles;
}

public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles) {
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();

    for (String role : roles) {
        authorities.add(new SimpleGrantedAuthority(role));
    }
    return authorities;
}

}

您的数据库应在 application.properties 中配置如下:

#DB properties:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/program
db.username=root
db.password=password

#Hibernate Configuration:
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql=true
entitymanager.packages.to.scan=com.program.model

这将允许您使用如下登录表单从您的数据库中登录用户。

<form method="post" action="<c:url value='j_spring_security_check'/>">
<table border="0px" cellpadding="0" cellspacing="0">
        <tbody>
                    <tr>
                            <td><spring:message code="login.login"/></td>
                            <td><input type="text" name="j_username" id="j_username"
                                size="30" maxlength="40" /></td>
                    </tr>
                    <tr>
                            <td><spring:message code="login.password"/></td>
                            <td><input type="password" name="j_password" id="j_password"
                                size="30" maxlength="32" /></td>
                    </tr>
                    <tr>
                            <td></td>
                            <td><input type="submit" value="Login" /></td>
                    </tr>
        </tbody>
</table>
</form>

我不建议使用连接链。我希望这会有所帮助!

【讨论】:

  • 感谢您的回复!我知道弹簧安全,但在这种情况下我不能使用它,为了验证用户我在数据库中有一个存储过程。我的问题(我的老板的问题)是我们不想将数据库的凭据放入应用程序中,正如我之前所说,我们只想将一个通用用户连接到一个模式,在该模式中放置一个带有链连接详细信息的表.谢谢你的推荐,我会努力说服老板的。
猜你喜欢
  • 2015-07-01
  • 2019-04-21
  • 2011-07-12
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2015-06-07
相关资源
最近更新 更多