前言

spring自带角色权限控制框架

用户-角色

数据库和dimain

  • 数据库
  1. -- 用户表
  2. CREATE TABLE sys_user(
  3. id int auto_increment PRIMARY KEY ,
  4. username VARCHAR(50),
  5. email VARCHAR(50) ,
  6. PASSWORD VARCHAR(80),
  7. phoneNum VARCHAR(20),
  8. STATUS int(1)
  9. );
  10. -- 角色表
  11. CREATE TABLE sys_role(
  12. id int auto_increment PRIMARY KEY,
  13. roleName VARCHAR(50) ,
  14. roleDesc VARCHAR(50)
  15. )
  16. -- 用户和角色中间表
  17. CREATE TABLE sys_user_role(
  18. userId int,
  19. roleId int,
  20. PRIMARY KEY(userId,roleId),
  21. FOREIGN KEY (userId) REFERENCES sys_USER(id),
  22. FOREIGN KEY (roleId) REFERENCES sys_role(id)
  23. )
  • domain
  1. public class SysUser {
  2. private Long id;
  3. private String username;
  4. private String email;
  5. private String password;
  6. private String phoneNum;
  7. private int status;
  8. private List<Role> roles;
  9. }
  10. public class Role {
  11. private Long id;
  12. private String roleName;
  13. private String roleDesc;
  14. }

静态页面

403.jsp

login.jsp

error.jsp

配置文件

springSecurity.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:security="http://www.springframework.org/schema/security"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/security
  8. http://www.springframework.org/schema/security/spring-security.xsd">
  9. <!--放行未登录访问的页面-->
  10. <security:http pattern="/login.jsp" security="none"></security:http>
  11. <security:http pattern="/error.jsp" security="none"></security:http>
  12. <security:http pattern="/css/**" security="none"></security:http>
  13. <security:http pattern="/img/**" security="none"></security:http>
  14. <security:http pattern="/pages/**" security="none"></security:http>
  15. <security:http pattern="/plugins/**" security="none"></security:http>
  16. <!--配置拦截器的路径规则
  17. auto-config="true" 表示使用权限框架默认的配置
  18. use-expressions="false" 关闭权限框架的表达式 spel
  19. intercept-url 拦截请求资源的路径
  20. access="ROLE_USER" 允许访问的条件 当前用户必须拥有ROLE_USER的角色才可以访问
  21. -->
  22. <security:http auto-config="true" use-expressions="true">
  23. <!--权限框架支持多种角色的登录 角色之间的关系为or 或者的关系-->
  24. <security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"></security:intercept-url>
  25. <!--自定义页面的配置节点-->
  26. <security:form-login login-page="/login.jsp"
  27. login-processing-url="/login"
  28. default-target-url="/index.jsp"
  29. authentication-failure-url="/error.jsp"></security:form-login>
  30. <!--登录成功权限不足的处理-->
  31. <security:access-denied-handler error-page="/403.jsp"></security:access-denied-handler>
  32. <!--csrf关闭跨域请求的攻击-->
  33. <security:csrf disabled="true"></security:csrf>
  34. <!--
  35. logout 退出请求的url路径 实际是页面点击按钮请求的地址
  36. logout-success-url 成功注销后 跳转的页面
  37. invalidate-session 设置session失效
  38. -->
  39. <security:logout logout-url="/logOut" logout-success-url="/login.jsp" invalidate-session="true"></security:logout>
  40. </security:http>
  41. <!--配置拦截后验证的节点-->
  42. <security:authentication-manager>
  43. <security:authentication-provider user-service-ref="userService">
  44. <!--自定义的加密工具类-->
  45. <security:password-encoder ref="pwdEncoder"></security:password-encoder>
  46. </security:authentication-provider>
  47. </security:authentication-manager>
  48. <!--配置自定义的加密工具类,这里使用自带的-->
  49. <bean id="pwdEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
  50. <!--开启注解支持-->
  51. <security:global-method-security secured-annotations="enabled"/>
  52. </beans>

web.xml引入

  • 引入filter
  1. <!--配置框架使用的filter过滤器-->
  2. <filter>
  3. <!--过滤器执行链名臣固定springSecurityFilterChain-->
  4. <filter-name>springSecurityFilterChain</filter-name>
  5. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>springSecurityFilterChain</filter-name>
  9. <url-pattern>/*</url-pattern>
  10. </filter-mapping>
  • 引入配置文件
  1. <!--spring的listener-->
  2. <listener>
  3. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  4. </listener>
  5. <context-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>classpath:applicationContext.xml,classpath:springSecurity.xml</param-value>
  8. </context-param>

service校验方法

  • 在service中继承spring接口
  1. public interface SysUserService extends UserDetailsService {
  2. @Override
  3. UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
  4. }
  • 实现接口
  1. @Service("userService")
  2. public class SysUserServiceImpl implements SysUserService {
  3. @Autowired
  4. private SysUserDao userDao;
  5. @Autowired
  6. BCryptPasswordEncoder pwdEncoder;
  7. @Override
  8. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  9. //得到数据库的用户
  10. SysUser sysUser = userDao.findUserByName(username);
  11. //框架的User对象用于验证返回 用户名 密码 用户的权限集合
  12. //查询得到用户真正的角色集合返回
  13. List<Role> roles =sysUser.getRoles();
  14. List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
  15. ///如果当前用户确实拥有角色 循环添加到集合中
  16. if(roles!=null&&roles.size()>0){
  17. for (Role role : roles) {
  18. authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
  19. }
  20. }
  21. User user = new User(sysUser.getUsername(),sysUser.getPassword(),authorities);
  22. return user;
  23. }
  24. }

用户名的获取

  • 前台获取
  1. # 方式一
  2. ${ sessionScope.SPRING_SECURITY_CONTEXT.authentication.principal.username }
  3. # 方式二
  4. <security:authentication property="principal.username"/>
  • 后台获取
  1. // 先获取到SecurityContext对象
  2. SecurityContext context = SecurityContextHolder.getContext();
  3. // 获取到认证的对象
  4. Authentication authentication = context.getAuthentication();
  5. // 获取到登录的用户信息
  6. User user = (User) authentication.getPrincipal();
  7. System.out.println(user.getUsername());

不同角色访问控制权限

jsp页面

  1. <security:authorize access="hasAnyRole('ROLE_USER','ROLE_ADMIN')">
  2. <li id="system-setting">
  3. <a href="${pageContext.request.contextPath}/product/findByPageHelper">
  4. <i class="fa fa-circle-o"></i> 产品管理
  5. </a>
  6. </li>
  7. </security:authorize>

后台

  • springmcv.xml
  1. <!--手打才能自动引入-->
  2. <security:global-method-security secured-annotations="enabled"></security:global-method-security>
  • controller
  1. @Secured("ROLE_ADMIN")
  2. public class RoleController

security权限控制的更多相关文章

  1. 自定义Spring Security权限控制管理(实战篇)

    上篇<话说Spring Security权限管理(源码)>介绍了Spring Security权限控制管理的源码及实现,然而某些情况下,它默认的实现并不能满足我们项目的实际需求,有时候需要 ...

  2. Spring Security权限控制

    Spring Security官网 : https://projects.spring.io/spring-security/ Spring Security简介: Spring Security是一 ...

  3. spring security 3.1 实现权限控制

    spring security 3.1 实现权限控制 简单介绍:spring security 实现的权限控制,能够分别保护后台方法的管理,url连接訪问的控制,以及页面元素的权限控制等, secur ...

  4. 权限控制框架Spring Security 和Shiro 的总结

    关于权限控制,一开始感觉比较难,后来先是接触了Spring Security 学起来也比较吃力,再是学习了Shiro,感觉简单很多. 总体来说这些框架,主要做了两个事情 Authentication: ...

  5. Spring Security(17)——基于方法的权限控制

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  6. Spring Security(16)——基于表达式的权限控制

    目录 1.1      通过表达式控制URL权限 1.2      通过表达式控制方法权限 1.2.1     使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2   ...

  7. 基于spring security 实现前后端分离项目权限控制

    前后端分离的项目,前端有菜单(menu),后端有API(backendApi),一个menu对应的页面有N个API接口来支持,本文介绍如何基于spring security实现前后端的同步权限控制. ...

  8. springboot整合security实现基于url的权限控制

    权限控制基本上是任何一个web项目都要有的,为此spring为我们提供security模块来实现权限控制,网上找了很多资料,但是提供的demo代码都不能完全满足我的需求,因此自己整理了一版. 在上代码 ...

  9. request.getRemoteUser() Spring Security做权限控制后

    一. request.getRemoteUser();//获取当前缓存的用户,比如Spring Security做权限控制后就会将用户登录名缓存到这里 request.getRemoteAddr(); ...

随机推荐

  1. PHP-GD库开发手记

    创建带有alpha通道的背景输出图像画中文字体获取长宽等比例缩放图片,也可以用于裁切实例代码 创建带有alpha通道的背景 $png = imagecreatetruecolor(800, 600); ...

  2. Mac下配置idea(Mac 10.12)

    idea应该是第二个最好用的开发工具,除了宇宙最强大的VS第一外,过来就是它,其体系中已经发布很多语言的开发工具. idea:http://bbs.feng.com/read-htm-tid-1050 ...

  3. 开源前夕先给大家欣赏一下我用C语言开发的云贴吧 网站自动兼容-移动、手机、PC自动兼容云贴吧

    开源前夕先给大家欣赏一下我用C语言开发的移动.手机.PC自动兼容云贴吧 - 涨知识属马超懒散,属虎太倔强.十二生肖全了!-转自云寻觅贴吧 转: 涨知识属马超懒散,属虎太倔强.十二生肖全了! -转自云寻 ...

  4. WP调用api

    private string GetText() { string resultString = string.Empty; HttpWebRequest request = HttpWebReque ...

  5. mongoDb数据库可视化工具 --- Robo

    工具下载: https://robomongo.org/download 最终效果: 即我们可以直接看到链接到 27017端口 的数据的所有数据,并且可以对其进行行之有效的增删查改. 注意,在下载软件 ...

  6. vSphere通过Client创建Centos7主机

    准备: vSphere Client 客户端 Centos7官方镜像,本次采用的是CentOS-7-x86_64-Minimal-1511.iso 创建过程: 1.登录vSphere虚拟主机,输入账户 ...

  7. springboot项目:项目部署

    第一步:打开终端,进入项目根目录  输入命令: cd /Users/liuxiaoming/Documents/software/ideawork/sell/ 第二步:对项目进行打包编译跳过测试: m ...

  8. spring中排除某个类

    在spring中可能需要排除某个类,做法是在spring配置文件中加入如下配置 <context:component-scan base-package="com.ias" ...

  9. Java二进制兼容性原理

    一.概述 现在的软件越来越依赖于不同厂商.作者开发的共享组件,组件管理也变得越来越重要.在这方面,一个极其重要的问题是类的不同版本的二进制兼容性,即一个类改变时,新版的类是否可以直接替换原来的类,却不 ...

  10. mysql修改root密码和对连接授权

    mysql修改root密码 首先 mysql -uroot -p 进入mysql界面后执行 set password for root@localhost = password('111111');  ...