版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
模块六管理端-权限控制《JavaEE企业级应用开发项目教程(SSM)》知识目标/Target了解认证和授权,能够简述认证和授权的概念掌握SpringSecurity的实现方式,能够使用SpringSecurity完成系统的认证和授权技能目标/Target掌握显示用户名的实现方式,能够使用SpringSecurity实现显示用户名的功能掌握退出登录的实现方式,能够使用<security:logout>过滤器实现退出登录的功能章节概述/
Summary在Web应用开发过程中,权限管理是非常重要的一个环节。传智健康管理端作为健康管理机构的后台系统,如果不建立权限管理,那么任何人都可以轻而易举地进行所有操作,显然,这样的效果并不是我们所希望的。接下来,本模块将对传智健康管理端的权限控制功能进行详细讲解。目录/Contents010203实现认证和授权显示用户名退出登录实现认证和授权6-1任务描述出于对系统安全性的考虑,我们希望用户在访问管理端时能够进行身份认证,即通过用户名和密码识别用户的身份,对于没有通过认证的用户不允许访问;对于通过认证的用户,允许访问本人对应角色被授权的资源。根据用户角色的不同,我们将用户分为普通用户、管理员、超级管理员,这3类角色对管理端资源的操作权限是不同的。本任务要求实现对用户身份进行认证,并将操作权限和用户角色进行绑定,从而通过角色授予用户不同的操作权限。任务分析(1)提交用户登录的请求(2)接收和处理用户登录请求(3)查询用户信息(4)展示登录结果为login.html页面中的“登录”按钮绑定单击事件,在单击事件触发后提交用户登录的请求。首先根据用户名查询该用户的个人信息;其次根据用户个人信息查询用户的角色;最后根据用户的角色查询角色对应的权限。SpringSecurityUserService类中的loadUserByUsername()方法接收页面提交的请求。login.html页面根据返回结果加以处理。任务分析认证和授权的实现过程知识进阶在权限管理的概念中,有两个非常重要的名词:认证和授权。认证系统提供的用于识别用户身份的功能,认证的目的是让系统识别当前用户的角色身份。授权授权即访问控制,控制用户可以访问哪些资源,用户进行身份认证后需要分配权限才可以访问系统资源。1.认证和授权的概念知识进阶2.SpringSecurity简介SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了SpringIoC、DI和AOP功能,在为企业应用系统安全控制编写代码时无须编写大量重复的代码。Web项目开发时,如果选择使用SpringSecurity作为权限管理框架,那么首先要做的是导入JAR包。SpringSecurity的核心JAR包具体如下。spring-spring-web.jar:Web工程必备的一个jar包,包含过滤器和相关的Web安全基础结构代码。spring-security-config.jar:用于解析XML配置文件。spring-security-taglibs.jar:SpringSecurity提供的动态标签库。知识进阶在health_parent父工程的pom.xml文件中引入SpringSecurity的依赖信息。<properties>
<spring.security.version>5.0.5.RELEASE</spring.security.version></properties><dependencyManagement>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version> </dependency> <dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version> </dependency> <dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version> </dependency>为web应用提供安全防护用于解析xml文件动态标签库3.SpringSecurity入门案例(1)导入SpringSecurity的依赖知识进阶在health_common子模块的pom.xml文件中引入SpringSecurity的依赖信息。<dependencies>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-taglibs</artifactId></dependency></dependencies>3.SpringSecurity入门案例(1)导入SpringSecurity的依赖知识进阶在health_backend子模块的web.xml文件中配置用于整合SpringSecurity框架的过滤器DelegatingFilterProxy。<!--委派过滤器,用于整合其他框架--><filter><!--整合springsecurity时,此过滤器的名称固定springSecurityFilterChain--><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/*</url-pattern></filter-mapping>3.SpringSecurity入门案例(2)配置web.xml知识进阶在health_backend子模块的src/main/resources目录下创建spring-security.xml文件,用于配置SpringSecurity的拦截规则和认证管理器。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"<!--配置过滤器--><security:httpauto-config="true"use-expressions="true"><!--intercept-url:定义一个拦截规则
pattern:对哪些url进行权限控制
access:在请求对应的URL时需要什么权限--><security:intercept-urlpattern="/**"access="hasRole('ROLE_ADMIN')"/></security:http>
</beans>自动配置,会使用springSecurity默认的认证页面3.SpringSecurity入门案例(3)配置spring-security.xml知识进阶在web.xml中指定项目启动时会加载springmvc.xml,如果想要spring-security.xml文件在项目启动时直接被加载,可以在health_backend子模块的springmvc.xml中导入配置文件spring-security.xml。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"
<importresource="classpath:spring-security.xml"></import></beans>3.SpringSecurity入门案例(4)修改springmvc.xml文件知识进阶创建一个名称为index的HTML文件,文件内容为“helloSpringSecurity!!”。依次启动Zookeeper服务,health_service_provider和health_backend服务。在浏览器访问http://localhost:82/index.html。3.SpringSecurity入门案例(5)SpringSecurity入门案例测试知识进阶在login.html页面中输入用户名admin和密码1234,单击“Login”按钮。3.SpringSecurity入门案例(5)SpringSecurity入门案例测试知识进阶在认证时,只需要判断用户输入的用户名和密码是否正确,因此只需要通过用户表进行校验即可。在授权时,首先根据用户查询该用户拥有哪些角色;再根据角色查询对应的菜单,这样就确定了用户能够看到哪些菜单。然后再根据用户的角色查询对应的权限,这样就确定了用户拥有哪些权限。在认证和授权的过程中涉及的系统的数据表包括用户表t_user、权限表t_permission、角色表t_role、菜单表t_menu、用户角色关系表t_user_role、角色权限关系表t_role_permission、角色菜单关系表t_role_menu。4.权限数据模型知识进阶角色表和用户表、权限表、菜单表之间都是多对多关系,用户、权限、菜单之间的关系是通过角色进行控制的。4.权限数据模型任务实现在health_backend子模块的src/main/webapp目录下导入登录页面login.html。(1)导入登录页面login.html任务实现根据权限数据模型设计实体类,在health_common子模块的com.itheima.pojo包下创建用户实体类User、角色实体类Role、权限实体类Permission和菜单实体类Menu,在类中声明属性,定义属性的getter/setter方法。(2)设计实体类任务实现在health_backend子模块的com.itheima.security包下创建SpringSecurityUserService类,实现UserDetailsService接口并重写loadUserByUsername()方法,用于处理查询用户信息的请求。@RestController
@ComponentpublicclassSpringSecurityUserServiceimplementsUserDetailsService{@Reference//查找服务,实现查询数据库privateUserServiceuserService;//根据用户名查询数据库中用户信息publicUserDetailsloadUserByUsername(Stringusername)throwsUsernameNotFoundException{Useruser=userService.findByUsername(username);//调用用户服务获取用户,角色、权限信息if(user==null){
returnnull;
}
省略
封装当前用户的角色和权限的过程returnneworg.springframework.security.core.userdetails.User(username,user.getPassword(),list);}}(3)实现用户认证任务实现在health_interface子模块的com.itheima.service包下创建接口UserService,在接口中定义findByUsername()方法,用于通过用户名查找用户。publicinterfaceUserService{//根据用户名查找用户publicUserfindByUsername(Stringusername);}(4)创建用户认证服务任务实现在health_service_provider子模块的com.itheima.service.impl包下创建UserService接口实现类UserServiceImpl,并重写接口的findByUsername()方法。@Service(interfaceClass=UserService.class)@TransactionalpublicclassUserServiceImplimplementsUserService{
publicUserfindByUsername(Stringusername){Useruser=userDao.findByUsername(username);if(user==null){returnnull;}
IntegeruserId=user.getId();Set<Role>roles=roleDao.findByUserId(userId);if(roles!=null&&roles.size()>0){for(Rolerole:roles){
IntegerroleId=role.getId();//获取角色idSet<Permission>permissions=permissionDao.findByRoleId(roleId);if(permissions!=null&&permissions.size()>0){role.setPermissions(permissions);//角色关联权限集合}}
user.setRoles(roles);//用户关联角色集合}returnuser;}}根据用户名查询用户信息根据用户id查询该用户关联的角色根据角色id查询该角色关联的权限(5)实现用户认证服务任务实现在health_service_provider子模块的com.itheima.dao包下创建接口UserDao,在接口中定义findByUsername()方法,用于根据用户名查找用户。publicinterfaceUserDao{publicUserfindByUsername(Stringusername);//根据用户名查找用户}(6)创建持久层接口任务实现在health_service_provider子模块的resources文件夹的com.itheima.dao目录中创建与UserDao接口同名的映射文件UserDao.xml,在文件中使用<select>元素映射查询语句,根据用户名查找用户。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.itheima.dao.UserDao"><!--根据用户名查找用户--><selectid="findByUsername"parameterType="string"resultType="com.itheima.pojo.User">SELECT
*FROMt_user
WHEREusername=#{value}</select></mapper>(6)创建持久层接口任务实现在health_service_provider子模块的com.itheima.dao包下创建接口RoleDao,在接口中定义findByUserId()方法,用于根据用户id查找用户拥有的角色。publicinterfaceRoleDao{//根据用户id查找用户拥有的角色publicSet<Role>findByUserId(IntegeruserId);}(6)创建持久层接口任务实现在health_service_provider子模块的resources文件夹下的com.itheima.dao目录中创建与RoleDao接口同名的映射文件RoleDao.xml,在文件中使用<select>元素映射查询语句,根据用户id查找用户拥有的角色。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.itheima.dao.RoleDao"><!--根据用户id查找用户拥有的角色--><selectid="findByUserId"parameterType="int"resultType="com.itheima.pojo.Role">
SELECTr.*FROMt_roler,t_user_roleur
WHEREr.id=ur.role_idANDur.user_id=#{user_id}</select></mapper>(6)创建持久层接口任务实现在health_service_provider子模块的com.itheima.dao包下创建接口PermissionDao,在接口中定义findByRoleId()方法,用于根据角色id查找用户拥有的权限。publicinterfacePermissionDao{//根据角色id查找用户拥有的权限publicSet<Permission>findByRoleId(IntegerroleId);}(6)创建持久层接口任务实现在health_service_provider子模块的resources文件夹下的com.itheima.dao目录中创建与PermissionDao接口同名的映射文件PermissionDao.xml。在文件中使用<select>元素映射查询语句,根据角色id查找用户拥有的权限。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.itheima.dao.PermissionDao"><!--根据角色id查找用户拥有的权限--><selectid="findByRoleId"parameterType="int"resultType="com.itheima.pojo.Permission">
SELECTp.*FROMt_permissionp,t_role_permissionrp
WHEREp.id=rp.permission_idANDrp.role_id=#{role_id}</select></mapper>(6)创建持久层接口任务实现对SpringSecurity入门案例中的spring-security.xml文件进行修改,在文件中重新添加过滤器、配置拦截规则、配置认证管理器,以及配置登录页面、密码加密等内容。<security:httpsecurity="none"pattern="/js/**"/><security:httpsecurity="none"pattern="/css/**"/><security:httpsecurity="none"pattern="/img/**"/><security:httpsecurity="none"pattern="/plugins/**"/><security:httpsecurity="none"pattern="/login.html"/>(7)修改spring-security.xml文件定义相关权限控制,指定哪些资源不需要进行权限校验。任务实现设置在页面中可以通过iframe访问受保护的页面,配置拦截规则,指定登录页面并配置登录信息。<security:httpauto-config="true"use-expressions="true"><security:headers><!--设置在页面可以通过iframe访问受保护的页面,默认为不允许访问--><security:frame-optionspolicy="SAMEORIGIN"></security:frame-options></security:headers><!--配置拦截规则,只要认证通过就可以访问--><security:intercept-urlpattern="/pages/**"access="isAuthenticated()"/><!--如果使用自己定义的登录页面,需要进行如下配置--><security:form-loginlogin-processing-url="/login.do"username-parameter="username"password-parameter="password"login="/login.html"default-target-url="/pages/main.html"></security:form-login><!--CSRF是一个过滤器disabled="true"表示关闭这个过滤器--><security:csrfdisabled="true"></security:csrf></security:http>用户名密码登录页面目标页面(7)修改spring-security.xml文件任务实现配置认证管理器,配置密码加密对象,以及开启注解方式权限控制。<!--配置认证管理器--><security:authentication-manager>
<security:authentication-provideruser-service-ref="springSecurityUserService">
<!--指定密码加密策略-->
<security:password-encoderref="passwordEncoder"/>
</security:authentication-provider></security:authentication-manager><!--配置密码加密对象--><beanid="passwordEncoder"class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/><!--开启注解方式权限控制--><security:global-method-securitypre-post-annotations="enabled"/>(7)修改spring-security.xml文件任务实现将springmvc.xml文件中的包扫描路径修改为com.itheima,以确保com.security包和itheima.controller包下的类都可以被扫描到。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"
<!--批量扫描-->
<dubbo:annotationpackage="com.itheima"/></beans>(8)修改springmvc.xml文件任务实现启动Zookeeper服务,在IDEA依次启动health_service_provider和health_backend。在浏览器中访问http://localhost:82/login.html。(9)测试用户认证任务实现输入用户名和密码后,单击“登录”按钮进行登录。成功跳转到管理端主页面,说明用户认证成功。(9)测试用户认证任务实现为删除检查项添加权限控制,以用户xiaoming的账号为例进行测试。在数据库中查询用户xiaoming拥有的权限。(10)权限控制任务实现使用xiaoming的账号登录管理端,删除没有被被检查组引用的检查项。(10)权限控制即使xiaoming没有删除检查项的权限,同样可以进行删除检查项的操作。任务实现在CheckItemController类的delete()方法中添加注解进行权限控制。publicclassCheckItemController{
//根据id删除检查项
@PreAuthorize("hasAuthority('CHECKITEM_DELETE')")//权限校验@RequestMapping("/delete")publicResultdelete(Integerid){
}}(10)权限控制任务实现在checkitem.html页面中定义showMessage()方法,用于在权限不足时弹出提示信息。//权限不足提示showMessage(r){if(r=='Error:Requestfailedwithstatuscode403'){//权限不足this.$message.error('无访问权限');return;}else{this.$message.error('未知错误');return;}},(11)定义权限不足提示方法任务实现修改checkitem.html页面中的handleDelete()方法,设置权限不足时弹出的提示信息。handleDelete(row){//弹出删除确认提示对话框this.$confirm('你确定要删除当前数据吗?','提示',{
}).then(()=>{//发送Ajax请求,将id提交到Controlleraxios.get("/checkitem/delete.do?id="+row.id).then((res)=>{
}).catch((r)=>{
this.showMessage(r);});}).catch(()=>{this.$message("已取消");});}(12)优化checkitem.html页面任务实现依次启动ZooKeeper服务、health_service_provider和health_backend,在浏览器中访问http://localhost:82/pages/checkitem.html。选择项目编号为0067的检查项执行删除操作。(13)测试授权显示用户名6-2任务描述一般情况下,当用户成功登录系统后,都会在系统入口的页面上显示登录用户的用户名,以表明当前是谁处于登录系统中。本任务要求在用户认证成功并跳转到系统主页main.html后,在页面显示用户名。任务分析当在login.html页面输入用户名和密码,单击“登录”按钮后,触发提交查询用户名的请求。(1)提交查询用户名请求由UserController类的getLoginUsername()方法接收页面提交的请求,获取当前登录用户的用户名。(2)接收和处理查询用户名请求main.html页面根据返回结果显示用户名。(3)显示用户名显示用户名任务分析显示用户名的实现过程任务实现要实现访问main.html页面时查询用户名,可以将查询用户名的操作定义在钩子函数created()中。created()函数在Vue对象初始化完成后自动执行。<scriptsrc="../js/axios-0.18.0.js"></script><script>newVue({
created(){//发送ajax请求,获取当前登录用户的用户名,用于页面展示
axios.get("/user/getLoginUsername.do").then((res)=>{this.username=res.data.data;//基于Vue的数据绑定展示用户名});}});</script>(1)提交查询用户名请求任务实现在health_backend子模块下创建控制器类UserController,在类中定义getLoginUsername()方法,用于获取当前登录用户的用户名。@RequestMapping("/getOrderSettingByMonth")@RestController@RequestMapping("/user")publicclassUserController{@RequestMapping("/getLoginUsername")publicResultgetLoginUsername(){try{//调用SpringSecurity框架提供的API获取当前用户的username展示到页面Useruser=(User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();Stringusername=user.getUsername();//获取用户名
returnnewResult(true,MessageConstant.GET_USERNAME_SUCCESS,usern
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度全国新能源汽车充电桩运营服务合同3篇
- 2025年橙子采摘与初加工服务合同4篇
- 2025版车牌买卖风险控制及保密协议4篇
- 二零二四年度新能源储能设备融资租赁合同担保全面协议3篇
- 二零二五年度农产品期货交易代理服务协议
- 二零二五年度教育培训机构租赁合同规范文本4篇
- 2025年金融公司合作伙伴保密协议模板3篇
- 2025产学研创新基地共建合同:电子信息产业技术孵化协议4篇
- 2025至2031年中国计算器行业投资前景及策略咨询研究报告
- 房地产营销策略-深度研究
- 2024患者十大安全目标
- 印度与阿拉伯的数学
- 会阴切开伤口裂开的护理查房
- 《钢铁是怎样炼成的》选择题100题(含答案)
- 实验报告·测定鸡蛋壳中碳酸钙的质量分数
- 部编版小学语文五年级下册集体备课教材分析主讲
- 电气设备建筑安装施工图集
- 《工程结构抗震设计》课件 第10章-地下建筑抗震设计
- 公司法务部工作细则(草案)
- 第18课《文言文二则 铁杵成针》(学习任务单)- 四年级语文下册部编版
- 《功能材料概论》期末考试试卷及参考答案2023年12月
评论
0/150
提交评论