注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

程序员小站

J2EE丨Spring | JVM | Scala

 
 
 

日志

 
 

Spring Security之完整的用户、权限及页面保护  

2012-05-31 12:00:41|  分类: spring |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

关于Spring Security的入门介绍请参考:spring security入门
首先建立一个spring xml文件,并在web.xml 的contextConfigLocation中声明
因为大部分元素都是security命名空间下的,于是把security设为默认命名空间(一般spring常用的是beans命名空间)
<?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-2.5.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">

<http>
<intercept-url pattern="/test.jsp*" access="ROLE_ADMIN"/>
<intercept-url pattern="/test2.jsp*" access="ROLE_ADMIN,ROLE_USER"/>
<intercept-url pattern="/test3.jsp*" access="ROLE_ANONYMOUS,ROLE_USER"/>


<!-- <anonymous username="guest" granted-authority="ROLE_GUEST"/> --><!--指定匿名用户角色-->
<!-- 提供匿名登录 -->
<anonymous/>
<form-login login-page="/login.jsp" default-target-url="/main.jsp"
authentication-failure-url="/login.jsp?error=true"/>
<logout logout-success-url="/login.jsp"/>
<!-- 记住我 -->
<remember-me/>
</http>

http里配置保护的页面和允许访问的角色,以及基础的表单功能。
1.intercept-url提供基本的页面拦截,只有access中指定的角色能够查看。
   注意:ROLE_ADMIN 和 ROLE_USER 两个角色,ROLE_USER角色能够访问的页面ROLE_ADMIN不一定能够访问。
2.anonymous 提供匿名登录功能,默认的匿名用户权限是ROLE_ANONYMOUS,当然也可以修改。
3.登陆表单,默认是spring自己提供的,不能满足我们的需求,这里我们指定为login.jsp default-target-url指定登陆成功后的页面,authentication-failure-url指定登陆失败后的页面,当然也是我们的登陆页。
4.logout指定登出成功后的页面。
5.remember-me声明支持保存用户名,把用户名保存到Cookie中,下次就可以直接登陆。
然后我们看看表单中的元素:

<form action="<c:url value='/j_spring_security_check'/>" method="post">
username:<input type="text" name="j_username"><br>
password:<input type="text" name="j_password"><br>
记住我:<input type="checkbox" name="_spring_security_remeber_me"><br>
<input type="submit" value="提交"/>
</form>

登陆的地址指定为spring提供的/j_spring_security_check,username password 也按照指定的写就行了,记住我功能就是我们上面配置的<remember-me/>
推出按钮: 
<a href="http://lishaofengstar.blog.163.com/blog/j_spring_security_logout">退出</a>

用户管理:
在<authentication-provider>标签下添加用户管理策略。
1.最简单的就是在spring-security.xml里面指定用户和角色。

<authentication-provider>

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

</authentication-provider>

说明,这里的角色名是自己起的,只要以ROLE_开头就行。注意用户角色和访问页面的角色要匹配
2.properties配置文件管理用户
<user-service properties="classpath:users.properties"></user-service>
然后添加在classpath下添加users.properties配置文件:

admin=admin,ROLE_ADMIN,ROLE_USER
aaa=aaa,ROLE_USER
bbb=bbb,ROLE_USER
ccc=ccc,ROLE_USER

等号前面是用户名,等号后面是密码,密码后面是角色名,多个角色用逗号隔开。
3.第三种就是基于数据库的用户管理:
在<authentication-provider>里添加: <jdbc-user-service data-source-ref="dataSource" />
配置数据源:

<!--dbcp数据源,当然也可以指定别的-->

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver"></beans:property>
<beans:property name="url" value="jdbc:mysql://localhost/test"></beans:property>
<beans:property name="username" value="root"></beans:property>
<beans:property name="password" value="123"></beans:property>
<beans:property name="initialSize" value="2"></beans:property>
<beans:property name="maxActive" value="5"></beans:property>
</beans:bean>

然后在数据库中建立如下表:

用户表:

CREATE TABLE `users` (
`username` varchar(255) NOT NULL DEFAULT '',
`password` varchar(255) DEFAULT NULL,
`enabled` bit(1) DEFAULT b'1',
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

角色表:
CREATE TABLE `authorities` (
`username` varchar(255) NOT NULL DEFAULT '',
`authority` varchar(255) DEFAULT NULL,
KEY `WAIJIAN` (`username`),
CONSTRAINT `WAIJIAN` FOREIGN KEY (`username`) REFERENCES `users` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

需要说明的是一个用户可以有多个角色,于是就在authorities表里插入两条记录,不能像上面配置一样用“,”隔开。
经过以上配置后就可以使用了,spring-security 默认采用以下SQL语句查询:

查询用户:

SELECT username,password,enabled

FROM users

WHERE username = ?

查询权限:

SELECT username , authority

FROM authorities

WHERE username = ?

如果要和你的原有的项目集成,可以自己制定sql语句,只要能查询出spring security 需要的表字段就行了

<jdbc-user-service data-source-ref="dataSource" >
users-by-username-query="select name as username, pass as password,able as enabled from users1

where name=?"
authorities-by-username-query="select name as username, rolea as authority from users1 where name=?"/>
</jdbc-user-service>

4.第四种是基于LDAP的验证,木有研究。

保护视图中的安全
比如说某个页面中的某些内容只有特定角色的人才能查看,当然spring security 标签库有比这更强大的功能,
导入jar包:spring-security-taglibs-2.01.jar  
 在页面引入spring security标签库:
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
1.显示当前用户和角色

欢迎您 , <security:authentication property="name" />
<security:authentication property="authorities" var="authorities"/>

您的角色是 :

<c:forEach items="${authorities}" var="authority">
${authority }&nbsp;&nbsp;&nbsp;
</c:forEach><br>

2.拥有所有 ROLE_ADMIN,ROLE_USER 权限才能查看:

admin用户可以看到如下内容:
<security:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER">
欢迎管理员
</security:authorize><br>

3.拥有任意 ROLE_ADMIN,ROLE_USER 权限就能查看:

<security:authorize ifAnyGranted="ROLE_ADMIN,ROLE_USER">
管理员和用户都可以看到此内容
</security:authorize><br>

4.拥有 ROLE_ADMIN 角色不能看到看到如下内容:

管理员看不到如下内容:
<security:authorize ifNotGranted="ROLE_ADMIN">
你不是管理员
</security:authorize><br>



好了,有了这些知识,我们就能够进行基本的用户和管理页面保护了。
  评论这张
 
阅读(3298)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017