《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)

使用控制器逻辑进行有条件渲染内容

 

         现在,让我们将刚刚用<authorize>标签实现的例子改成用java代码的方式。为了简洁起见,我们只实现一个例子,但实现基于控制器检查的其它例子是很简单直接的。

添加有条件显示的Log In链接

         为了替代Spring Security的<authorize>标签,我们假设在模型数据中有一个Boolean变量来标示是否显示显示“Log in”链接,而这个变量可以在视图上得到。在传统的MVC模式下,视图不了解模型为何拥有这个值,它只需要使用即可。我们使用Java Standard Tag Library (JSTL)的if标签,连同JSP EL表达式来实现有条件显示页面的部分。

 

Html代码   收藏代码
  1. <c:if test="${showLoginLink}">  
  2.   <c:url value="/login.do" var="loginUrl"/>  
  3.   <li><a href="${loginUrl}">Log In</a></li>  
  4. </c:if>  

 现在看一下如下的代码以了解我们如何在控制器中将数据填充到模型中。

基于用户的凭证提供模型数据

         我们控制器的对象模型是符合面向对象模式的,所有的Spring MVC控制器扩展自一个简单的基类com.packtpub.springsecurity.web.controller.BaseController。这使得我们能够将通用的代码放在BaseController中,从而应用中所有的控制器都能够访问。首先,我们加入一个方法以从当前的request中得到Authentication的实现类:

 

Java代码   收藏代码
  1. protected Authentication getAuthentication() {  
  2.   return SecurityContextHolder.getContext().getAuthentication();   
  3. }  

 接下类,我们添加一个方法 填充showLoginLink模型数据,此处使用Spring MVC的注解方式。

 

Java代码   收藏代码
  1. @ModelAttribute("showLoginLink")  
  2. public boolean getShowLoginLink() {  
  3.   for (GrantedAuthority authority : getAuthentication().  
  4. getAuthorities()) {  
  5.     if(authority.getAuthority().equals("ROLE_USER")) {  
  6.       return false;  
  7.     }    
  8.   }  
  9.   return true;  
  10. }  

 这个方法添加了@ModelAttribute注解,任何实现BaseController的控制器触发时,Spring MVC将会自动执行此方法。针对authorize标签方式的其它显示/隐藏功能,我们能够很简单地使用模型数据指令重复这种设计模式。

配置页面内授权的最好方式是什么?

         与以前版本的标签库相比,Spring Security 3 <authorize>标签的主要优势在于移除了很多使用中的困扰之处。在很多场景下,使用标签的url属性隔离了授权规则变化对JSP代码的影响。可以在以下场景下使用url属性:

l标签限制显示的功能能够通过一个简单url明确的声明;

l标签的内容能够明确的与URL隔离。

但是在典型的应用中,使用标签url属性的可能性会很低。现实情况下应用会比这个复杂的多,需要更多的相关逻辑才能确定如何渲染页面的各部分。

尽管使用Spring Security标签库来声明渲染页面部分的方法很诱人,这种方式基于sping的语法以及一些其它的方式(包括if...Granted和access方法),但是有很多情况下使用它并不是一个好主意:

l  Tag标签并不支持比角色成员更复杂的条件。例如,如果我们的应用的UserDetails实现包含了自定义的属性,如IP过滤、地理位置等,这些情况使用标准的<authorize>都不能支持。

但是,这些可以通过自定义的JSP标签或使用SpEL表达式来支持。即使如此,JSP也会直接绑定业务逻辑,而这并不是推荐做法。

l <authorize>标签必须在每一个使用的页面中引用。这可能会导致本来通用的规则产生潜在的不一致性,而这会在不同的物理界面文件中存在。好的面向对象系统设计建议条件规则只在一个地方存在,并在使用的地方对其进行引用。

可以通过封装并且重用JSP页面的部分来减少这类问题的发生(我们通过使用通用的JSP头文件已经对此进行了阐述),但是在一个复杂的应用中这个问题在所难免。

l 不能在编译阶段校验规则的正确性。编译期常量能够在典型的基于java对象系统中使用,JSP tag标签需要(典型情况下)硬编码角色名字,而简单的拼写错误很难被察觉。

公平来讲,这样的拼写错误能够很容易地在运行应用的功能测试中发现,但是使用标准的Java组件单元测试这样的问题更容易被发现。

         我们可以看到,尽管基于JSP方式的内容有条件渲染很便利,但是也有一些明显的不足。

        

         所有的这些问题都能够通过在控制器中使用代码推送数据到视图层来解决。另外,在代码中进行高级的授权决定能够享受到重用、编译器检查以及适当分离模型、视图、控制器所带来的好处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值