`
laodaobazi
  • 浏览: 272748 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring Security逐步深入

阅读更多

      上面的一个 Spring Security 的 demo 虽然使用了数据库来实现权限的控制,但是对于在项目中的应用来说这样的表结构过于简单,远远无法满足我们的需求。现在来实现自定义数据表从而达到权限的控制。下面给出创建自定义数据表的SQL(MySQL)语句。

SQL语句:

-- 角色
create table role(
  id bigint,
  name varchar(50),
  descn varchar(200)
);

ALTER TABLE `role` MODIFY COLUMN `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);

-- 用户
create table user(
  id bigint,
  username varchar(50),
  password varchar(50),
  status integer,
  descn varchar(200)
);

ALTER TABLE `user` MODIFY COLUMN `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);

-- 用户角色连接表
create table user_role(
user_id bigint,
role_id bigint
);
alter table user_role add constraint pk_user_role primary key(user_id, role_id);
alter table user_role add constraint fk_user_role_user foreign key(user_id) references user(id);
alter table user_role add constraint fk_user_role_role foreign key(role_id) references role(id);


insert into user(id,username,password,status,descn) values(1,'admin','admin',1,'管理员');
insert into user(id,username,password,status,descn) values(2,'user','user',1,'用户');
insert into role(id,name,descn) values(1,'ROLE_ADMIN','管理员角色');
insert into role(id,name,descn) values(2,'ROLE_USER','用户角色');
insert into user_role(user_id,role_id) values(1,1);
insert into user_role(user_id,role_id) values(1,2);
insert into user_role(user_id,role_id) values(2,2);

 

如何通过Spring Security来读取自己定义的表实现权限控制,下面给出applicationContext.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<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.0.xsd
                        		http://www.springframework.org/schema/security 
                        		http://www.springframework.org/schema/security/spring-security-3.0.xsd">

	<!-- 指定被拒绝的页面 -->
	<http auto-config='true' access-denied-page="/accessDenied.jsp">
		<!--
			login-page表示用户登陆时显示我们自定义的login.jsp
			authentication-failure-url表示用户登陆失败时,跳转到哪个页面,并添加一个error=true参数作为登陆失败的标示
			default-target-url表示登陆成功时,跳转到哪个页面
		-->
		<form-login login-page="/login.jsp" 
			authentication-failure-url="/login.jsp?error=true" 
			default-target-url="/index.jsp" 
		/>
		<!--登录页面不进行过滤,后面加一个*那是因为请求页面后面会带参数-->
		<intercept-url pattern="/login.jsp*" filters="none"/>
		<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
		<intercept-url pattern="/**" access="ROLE_USER" />
		<!-- 检测失效的sessionId,超时时定位到另外一个URL -->
		<session-management invalid-session-url="/sessionTimeout.jsp" >
			 <!-- 
				防止第二次登录
				如果想让第一次登录失效第二次登录启用则不要配置error-if-maximum-exceeded="true"
			  -->
			<concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>
		</session-management>
	</http>
	<authentication-manager>
		<authentication-provider>
			<!-- 
			(1) users-by-username-query:根据条件用户名查找用户的:username,passwd和enabled状态;
			(2) authorities-by-username-query: 根据条件用户名查找用户被授予的权限;
			 -->
			<jdbc-user-service data-source-ref="dataSource"
				users-by-username-query="SELECT username,password,status as enabled FROM user where username=?"
				authorities-by-username-query="select u.username,r.name as authority
						 from user u
						 join user_role ur
						 on u.id=ur.user_id
						 join role r
						 on r.id=ur.role_id
						 where u.username=?" 
			 />
		</authentication-provider>
	</authentication-manager>
	
	<!-- 国际化 -->
	<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
	  <!-- 如果不加载自己的国际化文件,去加载 Security 内部的国际化文件classpath:org/springframework/security/messages_zh_CN -->
	  <beans:property name="basename" value="classpath:messages_zh_CN"/>
	</beans:bean>
	
</beans:beans>

 关键的配置在此:

<jdbc-user-service data-source-ref="dataSource"
	users-by-username-query="SELECT username,password,status as enabled FROM user where username=?"
	authorities-by-username-query="select u.username,r.name as authority
			from user u
			 join user_role ur
			on u.id=ur.user_id
			join role r
			on r.id=ur.role_id
			where u.username=?" 
/>

 在上一个的例子基础之上进行如下的配置,运行程序达到自定义user用户表与role角色表,并通过两张表的中间表进行关联实现权限控制。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics