Java SSM 项目实战 day02 功能介绍,SSM整合,数据库和IDEA的maven工程搭建,产品信息查询和添加
Java SSM 项目实战 day03 功能介绍,订单的操作,订单的增删改查
Java SSM 项目实战 day04 功能介绍,订单的操作,订单的增删改查,实现登录功能
Java SSM 项目实战 day05 用户操作
Java SSM 项目实战 day06 角色操作,资源权限操作
Java SSM 项目实战 day07 SpringSecurity源码分析
Java SSM 项目实战 day07用户角色关联操作,添加角色,以及添加权限
Java SSM 项目实战 day08 方法级别的权限操作 服务器端的权限控制(JSR-250注解)(支持表达式的注解)(@Secured)以及页面端的权限控制
Java SSM 项目实战 day09 SSMAOP日志

一、服务器端方法级权限控制

在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制。Spring Security在方法的权限控制上
支持三种类型的注解,JSR-250注解、@Secured注解和支持表达式的注解,这三种注解默认都是没有启用的,需要
单独通过global-method-security元素的对应属性进行启用

1、开启注解使用

配置文件

<security:global-method-security jsr250-annotations="enabled"/>
<security:global-method-security secured-annotations="enabled"/>
<security:global-method-security pre-post-annotations="disabled"/>

注解开启
@EnableGlobalMethodSecurity :Spring Security默认是禁用注解的,要想开启注解,需要在继承
WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,并在该类中将
AuthenticationManager定义为Bean。

2、JSR-250注解

@RolesAllowed表示访问对应方法时所应该具有的角色
示例:
@RolesAllowed({"USER", "ADMIN"}) 该方法只要具有"USER", "ADMIN"任意一种权限就可以访问。
这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN

@PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制

@DenyAll是和PermitAll相反的,表示无论什么角色都不能访问

3、注解的使用

这里的配置在之前已经配置过

    //查询全部产品@RequestMapping("/findAll.do")@RolesAllowed("ADMIN")public ModelAndView findAll() throws Exception {ModelAndView mv = new ModelAndView();List<Product> ps = productService.findAll();mv.addObject("productList",ps);mv.setViewName("product-list");return mv;}

4、运行测试

(1)查看james用户的权限:没有ADMIN角色的权限

(2)登出当前用户,并登录james用户


(3)设置不显示403,修改web.xml

<error-page><error-code>403</error-code><location>/403.jsp</location></error-page>
(4)创建403.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head>
<!-- 页面meta -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"><title>权限</title></head><body><h1>权限不足</h1></body>
</html>
(5)再次运行测试



5、方法级权限控制-@Secured注解的使用

@Secured注解标注的方法进行权限控制的支持,其值默认为disabled。
示例:

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);@Secured("ROLE_TELLER")
(1)修改spring-security.xml文件

(2)修改OrdersController当中findAll方法添加@Secured("ADMIN")

(3)从新运行并测试

a、先让james登录


发现权限不足

a、后让tom登录:tom拥有ADMIN权限


依旧权限不足

(4)上面执行的流程不对(修改OrdersController当中的findAll方法) @Secured("ROLE_ADMIN")


为啥要这样因为
在这里配置权限拦截规则的时候是这样盘配置的

(5)注意

在使用JSR250的注解的时候,可以省略ROLE_前缀

而我们现在使用的@Secured注解是不能省略前缀的

(6)从新运行

a、tom登录



b、james登录


6、支持表达式的注解

@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问

示例:

@PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")void changePassword(@ P("userId") long userId ){}

这里表示在changePassword方法执行之前,

判断方法参数userId的值是否等于principal中保存的当前用户的userId

或者当前用户是否具有ROLE_ADMIN权限,两种符合其一,就可以访问该方法。

@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常

示例:

@PostAuthorize
User getUser("returnObject.userId == authentication.principal.userId orhasPermission(returnObject, 'ADMIN')");

@PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果

@PreFilter 允许方法调用,但必须在进入方法之前过滤输入值

(1)第一步:开启使用:修改spring-security.xml文件


 <security:global-method-security pre-post-annotations="enabled" jsr250-annotations="enabled" secured-annotations="enabled" ></security:global-method-security>
(2)第二步:修改UserController当中的save方法和findAll方法

指定只有tom用户可以执行save操作

只有ADMIN用户可以执行findAll方法

    //用户添加@RequestMapping("/save.do")@PreAuthorize("authentication.principal.username == 'tom' ")public String save(UserInfo userInfo) throws Exception {userService.save(userInfo);return "redirect:findAll.do";}@RequestMapping("/findAll.do")@PreAuthorize("hasRole('ROLE_ADMIN')")public ModelAndView findAll() throws Exception {ModelAndView mv = new ModelAndView();List<UserInfo> userList = userService.findAll();mv.addObject("userList", userList);mv.setViewName("user-list");return mv;}

(3)运行测试




fox1用户登录。fox1拥有ADMIN角色



点击新建用户


点击保存,发现权限不足,因为在上面设置了只有tom用户才可以添加用户

切换到tom用户




保存成功

二、页面端的权限控制

1、导入配置

(1)在maven当中的pom.xml文件当中导入

 <dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-taglibs</artifactId><version>${spring.security.version}</version>
</dependency>

(2)JSP页面导入

a、header.jsp页面当中

<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>

<security:authentication property="principal.username"></security:authentication>
b、aside.jsp页面当中

<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>

<p><security:authentication property="principal.username"></security:authentication>
</p>
c、重新运行项目



2、设置当前用户如果没有ADMIN就不能看到用户管理的选项

(1)修改aside.jsp

 <security:authorize access="hasRole('ADMIN')" ><li id="system-setting"><a href="${pageContext.request.contextPath}/user/findAll.do"> <i class="fa fa-circle-o"></i> 用户管理</a></li></security:authorize>

(2)修改spring-security.xml

 <security:http auto-config="true" use-expressions="true">
<!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" -->
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN') "/>

(3)运行项目

登录james


用户管理的选项消失了

登录tom,tom拥有ADMIN角色

用户管理依旧在

3、常用标签

在jsp中我们可以使用以下三种标签,其中authentication代表的是当前认证对象,可以获取当前认证对象信息,例
如用户名。其它两个标签我们可以用于权限控制

(1) authentication

<security:authentication property="" htmlEscape="" scope="" var=""/>

property: 只允许指定Authentication所拥有的属性,可以进行属性的级联获取,如“principle.username”,
不允许直接通过方法进行调用。

htmlEscape:表示是否需要将html进行转义。默认为true。

scope:与var属性一起使用,用于指定存放获取的结果的属性名的作用范围,默认我pageContext。Jsp中拥
有的作用范围都进行进行指定。

var: 用于指定一个属性名,这样当获取到了authentication的相关信息后会将其以var指定的属性名进行存放,默认是存放在pageConext中

(2) authorize

authorize
是用来判断普通权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示

<security:authorize access="" method="" url="" var=""></security:authorize>

access:

需要使用表达式来判断权限,当表达式的返回结果为true时表示拥有对应的权限

method:

method属性是配合url属性一起使用的,表示用户应当具有指定url指定method访问的权限,
method的默认值为GET,可选值为http请求的7种方法

url:

url表示如果用户拥有访问指定url的权限即表示可以显示authorize标签包含的内容

var:
用于指定将权限鉴定的结果存放在pageContext的哪个属性中

(3) accesscontrollist

accesscontrollist标签是用于鉴定ACL权限的。

其一共定义了三个属性:hasPermission、domainObject和var,其中前两个是必须指定的

<security:accesscontrollist hasPermission="" domainObject="" var=""></security:accesscontrollist>

hasPermission:
hasPermission属性用于指定以逗号分隔的权限列表

domainObject:
domainObject用于指定对应的域对象

var:
var则是用以将鉴定的结果以指定的属性名存入pageContext中,以供同一页面的其它地方使用

Java SSM 项目实战 day02 功能介绍,SSM整合,数据库和IDEA的maven工程搭建,产品信息查询和添加
Java SSM 项目实战 day03 功能介绍,订单的操作,订单的增删改查
Java SSM 项目实战 day04 功能介绍,订单的操作,订单的增删改查,实现登录功能
Java SSM 项目实战 day05 用户操作
Java SSM 项目实战 day06 角色操作,资源权限操作
Java SSM 项目实战 day07 SpringSecurity源码分析
Java SSM 项目实战 day07用户角色关联操作,添加角色,以及添加权限
Java SSM 项目实战 day08 方法级别的权限操作 服务器端的权限控制(JSR-250注解)(支持表达式的注解)(@Secured)以及页面端的权限控制
Java SSM 项目实战 day09 SSMAOP日志

Java SSM 项目实战 day08 方法级别的权限操作 服务器端的权限控制(JSR-250注解)(支持表达式的注解)(@Secured)以及页面端的权限控制相关推荐

  1. Java Web项目实战案例一

    Java Web项目实战案例一 一.主要开发工具如下: 1.物理机:windows 10 2.apache-maven-3.5.3 3.jdk1.8.0_161 4.Intellij 二.构建过程 项 ...

  2. java与es8实战之五:SpringBoot应用中操作es8(带安全检查:https、账号密码、API Key)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  3. JAVA框架项目实战:系统公告设计及实现

    项目实战:系统公告设计及实现 本期涉及内容:JDBC.点击即可跳转复习JDBC 1.需求及业务设计 项目(公告系统) 1.需求(为行政人员发布公告,通知提供遍历) 2.原型设计(系统做完以后是什么样子 ...

  4. SSM项目实战:酒店管理系统

    使用的技术栈:Spring+SpringMVC+mybatis+Mysql+layui+Maven Maven 项目结构.项目配置项为: 服务器:apache-tomcat-9.0.0.M26 (必须 ...

  5. SSM项目实战(SSM商城 Maven项目 商品、评论、回复)

    目录 前言 主要功能 开发环境 数据库设计 项目架构 项目技术介绍 运行效果展示 配置文件 项目源代码 总结 前言 SSM框架(spring+springMVC+mybatis),是目前比较主流的Ja ...

  6. SSM项目实战【从 0 到 1】:个人博客

    文章目录 前言 一.项目简介 二.项目技术栈 三.准备工作 1.Spring Boot 项目创建 2.mybatis 配置 3.数据库创建 四.基本框架搭建 1.实体层(model) 2.控制器层(c ...

  7. java ssm项目经验描述_第一个SSM完整项目开发心得

    博主因为打算要考研,所以为了给自己留一手后路.学习了SSM框架.这学期就做了一个完整的SSM项目.(如果考研失败就去外包做一波CRUD boy) 所以边考研边利用业余时间做了一学期,接着期末一周的We ...

  8. vue+elementui学生宿舍管理系统(报修,来访登记,水电费)java ssm项目介绍

    宿舍,是大学生在高校校园里一个重要的学习.生活.交往的空间环境,大学生大约有2/3的时间是在宿舍环境里渡过的.作为计算机应用的一部分,使用计算机对宿舍信息进行管理,具有着手工管理所无法比拟的优点.例如 ...

  9. Java秒杀系统实战系列~数据库级别Sql的优化与代码的调整

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十三篇,从本篇文章开始我们将进入"秒杀代码优化"环节,本文将首先从数据库级别Sql的优化入手,结合调整秒杀 ...

  10. java与es8实战之四:SpringBoot应用中操作es8(无安全检查)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

最新文章

  1. 漫谈回溯(未完待续)
  2. python新手入门讲解-这是大多数新手入门之后强烈推荐的python自学入门指南秘笈...
  3. python个人项目-软工作业个人项目wc.exe(python实现)
  4. 如何把本地项目上传到Github上面(详细版)
  5. 微信小程序界面跳转(1)
  6. Qt修炼手册2_动态设计
  7. c中volatile用法
  8. 我的第一个python web开发框架(2)——一个简单的小外包
  9. 设计模式--装饰模式
  10. 图像特征 可视化_使用卫星图像可视化建筑区域
  11. linux exfat分区格式化,技术|如何在 Linux 上将 USB 盘格式化为 exFAT
  12. docker基础+registry
  13. 回调函数 callback
  14. html网页文档无法复制粘贴图片,教你处理不能复制粘贴在网页中的详细图文
  15. 五、入门python第五课
  16. 2013-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧
  17. 西游记2--唐僧俗世篇
  18. 安卓手机各种信息获取---(通讯录短信息通话记录)
  19. Windows 9操作系统已经开始测试!
  20. 相位噪声基础及测试原理和方法

热门文章

  1. Todd Lammle's CCNA IOS Commands Survival Guide
  2. 星门跳跃-rqnoj-341
  3. MSE = Bias² + Variance?什么是“好的”统计估计器
  4. 计算机网卡的总线接口分类有,网卡的详细分类是怎样的?以太网卡有将高层数据转换为比特流的功能吗?...
  5. 哥德巴赫猜想 php,哥德巴赫猜想的程序验证
  6. UNI-APP_uni-app uni.getUserProfile微信授权,微信授权信息显示微信用户解决
  7. 案例分享:智邦科技上海办公室WLAN改造项目
  8. 有这5类人最难成为银行的优质客户!
  9. 【CityEngine教程文档】---01 基础教程
  10. 解决eclipse mars2中不能设置tomcat8.5