判断当前登录用户是否有所有URL的访问权限public static boolean

Download Report

Transcript 判断当前登录用户是否有所有URL的访问权限public static boolean

权限组件的配置搭建
Presented by
刘林
[email protected]
1
© Red Hat, Inc. 2010
权限组件的目标
• 它是一套登录及用户权限验证的组件
• 它允许定义任意的表结构,核心的三个要素是用户,角色,及
资源保护
• 现有的资源保护主要是基于URL地址保护
• 你只需要简单的配置,就可以为你的系统加上登录及权限保护
的功能
2
配置权限组件
• 1 加入组件包依赖
• 2 web.xml配置
• 3 spring-security.properties配置
• 4 security-context.xml配置
3
加入组件的依赖
<dependency>
<groupId>com.redhat</groupId>
<artifactId>redhat-auth-security</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在你的项目中加入此依赖
4
配置web.xml
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filterclass>org.springframework.web.filter.DelegatingFilterProx
y</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在web.xml加入这个filter,权限组件基于filter实现
5
spring-security配置
• 这个配置主要负责以下功能
• 1 配置获取用户,角色及资源的SQL语
句
• 2 配置权限的数据库连接
• 3 允许一个测试帐号的配置
• 你只需要在组件源代码下找到springsecurity.properties.back文件,复制到你
项目的src/main/resources下,进行修改
6
spring-security配置
• sc.userSql
• 配置获取用户的SQL语句,会传入一
个用户名参数,SQL的返回值必须包
含以下字段:
•
•
#USERNAME,PASSWORD,REAL_NAME,EMAIL,REGISTRY_DAT
E,IS_LOCKED,PASSWORD_LAST_UPDATE_DATE,DESCRIPTIO
N
例:select
•
USERNAME,PASSWORD,REAL_NAME,EMAIL,REGISTRY_DATE,IS_LOC
KED,PASSWORD_LAST_UPDATE_DATE,DESCRIPTION
From user where username = ?
7
spring-security配置
• sc.userRolesSql
• 这个属性配置当前用户拥有的角色,
会传入一个用户名的参数,返回值必
须包含ROLE_NAME字段
• 例:select role_name from role where
user_name = ?
8
spring-security配置
• sc.resourceSql
• 这个属性不会传入任何参数
• 它的作用是获取所有的角色及对应 的
资源保护列表
• 它必须包含URL,ROLE字段
#
#
#
#
URL
/index.action
/index.action
/admin.action
9
ROLE
ROLE_USER
ROLE_ADMIN
ROlE_ADMIN
spring-security配置
•
•
•
•
•
有关数据库的配置属性如下:
sc.url ---数据库URL地址
sc.driver---数据库驱动地址
sc.username---数据库用户名
sc.password---数据库密码
10
spring-security配置
• 测试帐号的配置
• 测试帐号是指此帐号不受权限约束,
可以自由登录及访问,它是虚拟的,
不需要是数据库中存在的
• sc.testUsername--测试帐号用户名
• sc.testPassword---测试帐号密码
• sc.allowTestUser---是否启用测试帐号
(true or false)
11
security-context配置
• 这个配置是spring security的一个XML
配置
• 你可以从源文件中找到securitycontext.xml.back找到它,放到你项目
有效的spring的地方
• 它其中的大多数不需要修改,可以修
改的包括登录页面的相关设置及xml式
的权限配置
12
security-context配置
• 配置登录页面
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=true"
default-target-url="/" />
•
•
•
•
Login-page:你自己的登录页面
authentication-failure:登录失败跳转的页面
default-target-url:登录成功默认的跳转页面
你可以删除这段配置,这样可以使用spring security的默认配
置页面
13
security-context配置
• 配置权限否定页面
<http
auto-config='true'
access-denied-page="/errorpages/403.jsp" >
• 修改access-denied-page为你自己的
权限否定页面
• 你可以删除这个属性,这样会使用到
springsecurity的默认权限否定页面
14
配置完成
• 经过以上几个步骤,你访问你的项目,
如果出现登录页面,表明你的配置成
功了
• 你可以开始进行权限的配置了
15
权限配置
• 权限配置有两种
• 1 security-context.xml中进行xml式的
配置
• 2 在数据库表中进行角色及资源保护
配置
16
权限配置
• Xml及数据库两种配置的区别
• 1 xml支持通配符,如*这种,数据库中则
是精确匹配
• 2 先进行xml验证,再进行数据库验证,
两者都通过才能验证成功
• 3 xml配置需要重启系统,数据库配置时
时生效
• 对于一些变动不大或需要使用*等通配符
的放入xml配置比较好,而对于更为精确
的匹配使用数据库配置
17
权限配置-xml配置
• Xml权限配置是spring security默认提
供的配置方式
• 核心是配置<intercept-url/>
• 关于xml配置参照权限配置说明文档或
spring security官方文档
18
权限配置-数据库配置
• 数据库不能使用通配符,这样做是基
于效率的考虑
• 数据库验证时,会将URL的?后的参
数去掉
• http://localhost:8080/system/systemedit.action?id=23
• 会被认转换为
http://localhost:8080/system/systemedit.action
19
使用权限信息
• 权限信息可能在页面中或程序中会被
使用到
• 提供了程序类封闭及页面的标签封装,
供系统调用获取权限信息
• 页面标签是基于freemarker,如果使用
JSP,你可以使用默认的
springsecurity标签
20
使用权限信息-页面调用
•
•
•
•
•
•
<@auth.user/>
获取登录用户的某一属性
获取用户名:
<@auth.user property="username"/>
获取用户邮箱:
<@auth.user property="email"/>
21
使用权限信息-页面调用
• <@auth.authorize/>
• 页面权限验证标签,相当于if语句,有
权限时,才会显示相应的页面内容
• 1 基于role的判断
• 2 基于资源的判断
•
22
使用权限信息-页面调用
• 基于role的判断
•
•
•
<@auth.authorize role="ROLE_ADMIN">
若用户拥有ROLE_ADMIN权限,此内容便显示
</@auth.authorize>
•
<@auth.authorize role="ROLE_ADMIN;ROLE_SYSTEM"
allAuthorized="true">
1 多个角色请以;间隔
2 allAuthorized为true,表明用户要有所有这些角色,才为真
3 allAuthorized为false时,表明用户只须拥有任意一角色,便为真
4 allAuthorized可以不定义,默认为真
</@auth.authorize>
•
•
•
•
•
23
使用权限信息-页面调用
• 基于URL的验证
•
•
•
<@auth.authorize url="/index.action">
用户若能访问/index.action,此内容便会被显示
</@auth.authoriz>
•
<@auth.authorize url="/system-add.action;/system-update.action"
allAuthorized="true">
1 多个URL,请以分号(;)间隔开来
2 allAuthorized="true"时,用户要同时具有所有URL访问权限,才
为真
3 allAuthorized="false"时,用户只须有任意一个URL访问权限,便
为真
3 allAuthorized默认为true
</@auth.authoriz>
•
•
•
•
•
24
使用权限信息-程序调用
• AuthUserUtil类 获取用户信息
public static UserInfo getLoginUser()
获取当前登录的用户,返回一个UserInfo类,它是一个
用户类
public static Object getUserProperty(String property)
获取当前登录的用户的某一属性
public static ArrayList<String> getRoles()
获取当前登录用户所具有的所有角色集合
25
使用权限信息-程序调用
• AuthAuthorizeUtil类,权限判断类
public static boolean hasAuthorize(String url)
判断当前登录用户是否有指定URL的访问权限
public static boolean hasAllAuthorize(String[] urls)
判断当前登录用户是否有所有URL的访问权限
public static boolean hasAnyAuthorize(String[] urls)
判断当前登录用户是否有任意一URL的访问权限
public static boolean hasRole(String role)
判断当前用户是否拥有某角色
public static boolean hasAllRoles(String[] roles)
判断当前用户是否具有所有这些角色
26
public static boolean hasAnyRoles(String[] roles)
判断当前登录用户是否具有任意一角色
使用权限信息-程序调用
• 用户缓存管理类 UserCacheUtil
public static void
removeCacheByUserName(String username)
清除指定用户的缓存信息
public static void removeAllUserCache()
清除所有用户的缓存信息
27
使用权限信息-程序调用
• URL资源保护缓存管理类
ResourceCacheUtil
public static void removeAllResourceCache()
清除所有URL缓存
28
权限组件-扩展
• 如何扩展功能?
• 登录时不只用户名和密码,还有很多
附加信息,如何处理?
29
终结
• 谢谢
30