上面的一个 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角色表,并通过两张表的中间表进行关联实现权限控制。
分享到:
相关推荐
SpringSecurity入门到进阶到高级,是我们老师给我们讲课用的,我们都照着配就没有问题,可以跑通,
Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf
视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 首先,SSM环境中我们通过xml配置的...Springsecurity在两种不同的开发模式中使用,有经典的独立web后台管理系统,也有时下最流行的前后端分离场景。
Spring Security 演讲PPT(演讲嘉宾:张明星) WebSphere技术专家沙龙在广州圆满举办,WSC超级版主Fastzch(张明星)担任本次沙龙的演讲嘉宾,他给广州的WebSphere技术专家带来了以“Spring Security ”为主题的...
Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf
spring security spring security 中文文档
Spring Security in Action
springsecurity是一个功能强大且高度可定制的身份验证和访问控制框架。springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以...
很多独立软件供应商,因为灵活的身份验证模式二选择Spring Security。这样做允许他们快速的集成到他们的终端客户需求的解决方案而不用进行大量工程或者改变客户的环境。如果上面的验证机制不符合你的需求,Spring ...
SpringSecurity框架的权限认证流程原理,请求到来时SpringSecurity如果调用层层过滤器来完成认证;
三更springsecurity学习笔记
1.本项目为SpringCloud Gateway的微服务框架,整合了SpringSecurity,微服务间使用Redis来获取登陆的用户信息。 2.由于Gat
spring security2.5 jar 和spring security2.5 整合必须的jar包
Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...
该资源是基本Spring Security实战七篇文档中组织的源码,详情如下: ssecurity项目是Spring Security实战(一和二)的源码; ssecurity-db项目是Spring Security实战(三)的源码; ssceurity-page项目是Spring ...
SpringSecurity学习总结源代码
Spring Security。 官网 Spring Security API(Spring Security 开发文档).CHM
spring security3 中文版本
SpringSecurity视频讲解,内含课程演示的源代码,,,,,,
Spring Security 2.0.x 参考手册 中文版