springsecurity基于数据库验证用户

之前的springsecurity程序都是将数据存放在内存中的,通过

 <security:user-service>
<security:user name="user" password="user" authorities="ROLE_USER"/>
<security:user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN"/>
</security:user-service>

user-service指定用户信息,例如name,password和权限

但是这样的验证在开发中是不科学的,所以我们要连接数据库,通过匹配数据库中的信息判断用户是否登陆

首先我们需要添加依赖,需要继续添加的依赖有spring-jdbc,spring-core,spring-web,spring-webmvc,mysql-connector-java

添加完依赖后我们需要加入数据库的配置文件

在spring-security配置文件中配置datasource

jdbc-user-service 元素,通过该元素我们可以定义一个从数据库获取 UserDetails 的 UserDetailsService, dataSource 是对应数据源配置的 bean 引用

完整的spring-security.xml配置文件:

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--加载数据库的配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
</bean>
<!--
自定义表单,通过form-login标签
authentication-failure-url指定登陆失败以后应该跳转的页面
default-target-url指定登陆成功以后跳转的页面,默认的是index.jsp页面
-->
<security:http auto-config="true">
<security:form-login login-page="/login.jsp"
default-target-url="/successful.jsp"
login-processing-url="/login.do"
authentication-failure-url="/login_failure.jsp"
always-use-default-target="true"
username-parameter="username"
password-parameter="password"
/>
<!-- 表示匿名用户可以访问 -->
<security:intercept-url pattern="/login*.jsp*"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http> <security:authentication-manager>
<security:authentication-provider>
<security:jdbc-user-service data-source-ref="dataSource"/>
</security:authentication-provider>
</security:authentication-manager> </beans>

默认情况下 jdbc-user-service 将使用 SQL 语句 “select username, password, enabled from users where username = ?” 来获取用户信息;使用 SQL 语句 “select username, authority from authorities where username = ?” 来获取用户对应的权限;

若数据库表名不是系统默认的,我们可以通过属性 users-by-username-query 来指定查询用户信息的时候是从自定义用户信息表中查询,通过authorities-by-username-query来查询用户权限

另外还有一种连接数据库的方法

 <security:authentication-manager>
<security:authentication-provider user-service-ref="userDetailsService"/>
</security:authentication-manager> <bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>

JdbcDaoImpl是支持用户组查询的

上一篇:UVALive - 3263 That Nice Euler Circuit (几何)


下一篇:Java基础 - 面向对象 - 类的定义