基于URL权限管理

基于URL权限管理
什么是权限管理
只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户认证和授权两部分。
用户认证
1.用户认证,用户去访问系统,系统要验证用户身份的合法性。最常用的用户身份验证的方法:1、用户名密码方式、2、指纹打卡机、3、基于证书验证方法。。系统验证用户身份合法,用户方可访问系统的资源。
2.认证流程在这里插入图片描述
3.关键对象
- subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份认证
- principal:身份信息,通常是唯一的,一个主体还有多个身份信息,但是都有一个主身份信息
- credential:凭证信息,可以时密码,证书,指纹等
总结:主体在进行身份认证时需要提供身份信息和凭证信息
用户授权
1.用户授权,简单理解为访问控制,在用户认证通过后,系统对用户访问资源进行控制,用户具有资源的访问权限方可访问。
2.授权流程
在这里插入图片描述
3.关键对象
授权的过程理解为:who对what(which)进行how操作
- who:主体即subject,subject在认证通过后系统进行访问控制
- what(which):资源(Resource),subject必须具备资源的访问权限才可访问该资源,资源比如:系统用户列表页面,商品修改菜单等等. 资源分为资源类型和资源实例,系统的用户信息就是资源类型,相当于Java类.系统中id为1的用户就是资源实例,相当于new的Java对象.
- how:权限/许可(permission),针对资源的权限或许可,subject具有permission访问资源,如何访问/操作需要定义permission,权限比如:用户添加,用户修改,商品删除等等.
4.权限模型
- 主体(账号,密码)
- 资源(资源名称,访问地址)
- 权限(权限名称,资源id)
- 角色(角色名称)
- 主体与角色关系(主体id,角色id)
- 角色与权限关系(角色id,权限id)
在这里插入图片描述
5.基于URL权限管理流程
在这里插入图片描述
配置拦截器
mvc:interceptors
mvc:interceptor
<!-- 用户认证拦截 拦截所有请求>
<mvc:mapping path="/" />

</mvc:interceptor>
</mvc:interceptors>
编写认证拦截器
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object object){
//得到请求的url
String url = request.getRequestURI();
//判断是否是公开地址,公开地址配置在配置文件中
List open_urls = ResourceUtil.getKeyList(“anonymousURL”);
//遍历公开地址,如果是公开地址则放行
for(String open_url:open_urls){
if(url.indexof(open_url)>=0){
//如果是公开地址则放行
return true;
}
}
//判断用户身份是否存在Session中
HttpSession session = request.getSession();
ActiveUser activeuser = (ActiveUser) session.getAttribute(“user”)
//如果用户身份在session中存在则放行
if(user != null){
return true;
}
//执行到这里拦截,跳转到登录界面,用户进行身份认证
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
6.授权
用户认证通过后取出菜单和url放入session
//得到用户id
String userid = sysUser.getId();
//根据用户id查询菜单
List menus = this.findMenuListByUserId(userid);
//根据用户id查询权限url
List permissions = this.findPermissionListByUserId(userid);
//认证通过,返回用户身份信息
ActiveUser activeUser = new ActiveUser();
activeUser.setUserid(sysUser.getId());
activeUser.setUsercode(sysUser.getUserCode());
activeUser.setUsername(sysUser.getUsername());
//放入权限范围的菜单和url
activeUser.setmenus(menus);
activeUser.setPermission(permissions);
菜单动态显示
<c:if test=" a c t i v e U s e r . m e n u s ! = n u l l &quot; &gt; &lt; u l &gt; &lt; c : f o r e a c h i t e m s = &quot; {activeUser.menus != null}&quot;&gt; &lt;ul&gt; &lt;c:foreach items=&quot; activeUser.menus!=null"><ul><c:foreachitems="{activeUser.name}" var=“menus”>

</c:foreach>

</c:if>
授权拦截器
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)throws Exception{
//得到请求的url
String url = request.getRequestURI();
//判断是否是公开地址
List open_urls = ResourcesUtil.getkeyList(“anonymousURL”)
//遍历公开 地址,如果是公开 地址则放行
for(String open_url:open_urls){
if(url.indexOf(open_url)>=0){
//如果是公开 地址则放行
return true;
}
}
//从配置文件中获取公共访问地址
List common_urls = ResourcesUtil.getkeyList(“commonURL”);
//遍历公用地址,如果是公用地址则放行
for(String common_url:common_urls){
if(url.indexOf(common_url) >= 0){
return true;
}
}
//获取session
HttpSession session = request.getSession();
ActiveUser activeUser = (ActiveUser) session.getAttribute(“activeUser”);
//从session中取权限范围的url
List permissions = activeUser.getPermissions();
for(SysPermission sysPermission:permissions){
//权限的url
String permission_url = sysPermission.getUrl();
if(url.indexOf(permission_url) >= 0){
//如果是权限的url 地址则放行
return true;
}
}
//执行到这里拦截,跳转到无权访问的提示页面
request.getRequestDispatcher("/WEB-INF/jsp/refuse.jsp").forward(request,response);
//如果返回false标识拦截不继续执行handler,如果返回true表示放行
return false;
}
配置授权拦截器
mvc:interceptors
mvc:interceptor

<mvc:mapping path="/
"/>

</mvc:interceptor>
</mvc:interceptors>
总结:使用基于url拦截的权限管理方式,实现起来比较简单,不依赖框架,使用Web提供filter就可以实现.缺点需要将所有的url全部配置起来,有些繁琐,不易维护,url(资源)和权限表示方式不规范.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值