spring security 使用众多的拦截器实现权限控制的, 其核心有2个重要的概念: 认证(Authentication) 和授权 (Authorization)), 认证就是确认用户可以访问当前系统, 授权即确定用户有相应的权限,

现在先大概过一遍整个流程,用户登陆,会被AuthenticationProcessingFilter拦截,调用AuthenticationManager的实现,而且AuthenticationManager会调用ProviderManager来获取用户验证信息(不同的Provider调用的服务不同,因为这些信息可以是在数据库上,可以是在LDAP服务器上,可以是xml配置文件上等),如果验证通过后会将用户的权限信息封装一个User放到spring的全局缓存SecurityContextHolder中,以备后面访问资源时使用。
访问资源(即授权管理),访问url时,会通过AbstractSecurityInterceptor拦截器拦截,其中会调用FilterInvocationSecurityMetadataSource的方法来获取被拦截url所需的全部权限,在调用授权管理器AccessDecisionManager,这个授权管理器会通过spring的全局缓存SecurityContextHolder获取用户的权限信息,还会获取被拦截的url和被拦截url所需的全部权限,然后根据所配的策略(有:一票决定,一票否定,少数服从多数等),如果权限足够,则返回,权限不够则报错并调用权限不足页面 ( http://blog.csdn.net/u012367513/article/details/38866465)
本例的用户和角色信息存储在mysql, 使用mybatis进行查询:http://www.cnblogs.com/wenbronk/p/7357996.html

项目 使用 idea + gradle

dependencies {compile("org.springframework.boot:spring-boot-devtools")compile("org.springframework.boot:spring-boot-starter")compile("org.springframework.boot:spring-boot-starter-web")compile("org.springframework.boot:spring-boot-starter-log4j2")compile("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml")compile("org.codehaus.groovy:groovy-all:2.4.12")compile("org.springframework.boot:spring-boot-starter-security")compile("org.springframework.boot:spring-boot-starter-thymeleaf")compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4")compile ("mysql:mysql-connector-java")compile 'com.alibaba:druid-spring-boot-starter:1.1.2'compile ("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1")compile 'com.alibaba:fastjson:1.1.15'compile 'javax.inject:javax.inject:1'testCompile group: 'junit', name: 'junit', version: '4.12'testCompile("org.springframework.boot:spring-boot-starter-test")}

1, 导入基础数据, 调试mybatis

1) , 建表

/*
Navicat MySQL Data Transfer
Source Server         : 本地
Source Host           : localhost:3306
Source Database       : test
Target Server Type    : MYSQL
Date: 2017-8-14 22:17:33
*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for `sys_user`
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (`id` INT (32) NOT NULL AUTO_INCREMENT COMMENT '主键id',`username` varchar(32) DEFAULT NULL COMMENT '用户名',`password` varchar(32) DEFAULT NULL COMMENT '密码',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for `sys_role`
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (`id` INT (32) NOT NULL AUTO_INCREMENT COMMENT '主键id',`name` varchar(32) DEFAULT NULL COMMENT '用户名',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for `sys_role_user`
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_user`;
CREATE TABLE `sys_role_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',`sys_user_id` INT(32) NOT NULL COMMENT 'user_id',`sys_role_id` INT(32) NOT NULL COMMENT 'role_id',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;ALTER TABLE sys_role_user ADD CONSTRAINT sys_FK1 FOREIGN KEY(sys_user_id) REFERENCES sys_user(id);
ALTER TABLE sys_role_user ADD CONSTRAINT role_FK2 FOREIGN KEY(sys_role_id) REFERENCES sys_role(id);

导入数据

insert into SYS_USER (id,username, password) values (1,'vini', '123');
insert into SYS_USER (id,username, password) values (2,'bronk', '123');insert into SYS_ROLE(id,name) values(1,'ROLE_ADMIN');
insert into SYS_ROLE(id,name) values(2,'ROLE_USER');insert into SYS_ROLE_USER(SYS_USER_ID,sys_role_id) values(1,1);
insert into SYS_ROLE_USER(SYS_USER_ID,sys_role_id) values(2,2);

在 application.yml中配置如下, 可以在启动程序时自动执行

spring: datasource:url: jdbc:mysql://localhost:3306/springboot
    username: rootpassword: root
#    type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driver  # 一下2行schema: classpath:security.sqldata: classpath:security-data.sql

2), mapper映射

package com.wenbronk.security.mapperimport com.wenbronk.security.entity.SysUser/*** Created by wenbronk on 2017/8/14.*/
interface SysUserMapper {SysUser findByUserName(String username)
}

在 resources/mybatis/mapper中添加:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.wenbronk.security.mapper.SysUserMapper"><resultMap id="sys_user_map" type="SysUser"><id property="id" column="id" /><result property="username" column="username" /><result property="password" column="password" /><collection property="roles" ofType="SysRole"><result column="name" property="name" /></collection></resultMap><select id="findByUserName" parameterType="string" resultMap="sys_user_map">select u.id, u.username, u.password, r.namefrom sys_user uLEFT JOIN sys_role_user s on u.id = s.sys_user_idLEFT JOIN sys_role r on r.id = s.sys_role_idWHERE username = #{username}</select>
</mapper>

在application.yml中配置

mybatis:config-location: classpath:mybatis/SqlMapConfig.xmlmapper-locations: classpath:mybatis/mapper/*.xml

在main方法上添加mapper扫描:

@SpringBootApplication
@MapperScan("com.wenbronk.security.mapper")
public class SecurityApplication {public static void main(String[] args) {SpringApplication.run(SecurityApplication.class);}
}

3), 实体类

class Msg {String titleString contentString etraInfoMsg() {}Msg(String title, String content, String etraInfo) {this.title = titlethis.content = contentthis.etraInfo = etraInfo}
}

SysUser.groovy

package com.wenbronk.security.entity/*** Created by wenbronk on 2017/8/14.*/
class SysUser {int iddef usernamedef passwordList<SysRole> roles@Overridepublic String toString() {return "SysUser{" +"id=" + id +", username=" + username +", password=" + password +", roles=" + roles +'}';}
}

SysRole.groovy

package com.wenbronk.security.entity/*** Created by wenbronk on 2017/8/14.*/
class SysUser {int iddef usernamedef passwordList<SysRole> roles@Overridepublic String toString() {return "SysUser{" +"id=" + id +", username=" + username +", password=" + password +", roles=" + roles +'}';}
}

4) , 测试mybatis

    @Testvoid test2() {def name = sysUserMapper.findByUserName('vini')println name}

2, security相关配置

1), CustomerUserService.groovy
package com.wenbronk.security.security.serviceimport com.wenbronk.security.entity.SysRole
import com.wenbronk.security.entity.SysUser
import com.wenbronk.security.mapper.SysUserMapper
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.core.userdetails.User
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UserDetailsService
import org.springframework.security.core.userdetails.UsernameNotFoundException
import org.springframework.stereotype.Serviceimport javax.inject.Inject
/*** Created by wenbronk on 2017/8/15.*/
@Service
class CustomUserService implements UserDetailsService {@InjectSysUserMapper sysUserMapper;@OverrideUserDetails loadUserByUsername(String s) throws UsernameNotFoundException {def sysUser = sysUserMapper.findByUserName(s) as SysUserassert sysUser != nullList<SimpleGrantedAuthority> authorities = new ArrayList<>()for(SysRole role : sysUser.getRoles()) {authorities.add(new SimpleGrantedAuthority(role.getName()))println role.getName();}return new User(sysUser.getUsername(), sysUser.getPassword(), authorities)}
}

2), WebSecurityConfig.groovy

package com.wenbronk.security.security.configimport com.wenbronk.security.security.service.CustomUserService
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapterimport javax.inject.Inject
/*** Created by wenbronk on 2017/8/15.*/
@Configuration
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {@InjectCustomUserService customUserService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(customUserService);}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated()   // 任何请求都拦截
            .and().formLogin().loginPage("/login").failureUrl("/login?error").permitAll()        // 登陆后可访问任意页面
            .and().logout().permitAll();  // 注销后任意访问
}
}

3, 页面

1), 页面转向设置

package com.wenbronk.security.configimport org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
/*** Created by wenbronk on 2017/8/15.*/
@Configuration
class WebMvcConfig extends WebMvcConfigurerAdapter{@Overridevoid addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/login").setViewName("login")
    }
}

controller.groovy

package com.wenbronk.security.controllerimport com.wenbronk.security.entity.Msg
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.RequestMapping
/*** Created by wenbronk on 2017/8/14.*/
@Controller
class SecurityController {@RequestMapping("/")def index(Model model) {def msg = new Msg("测试标题", "测试内容", "额外信息, 只对管理员显示")model.addAttribute("msg", msg);"home"}}

在resources下放入静态资源, bootstramp.min.css, 以及thymeleaf页面

login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta content="text/html;charset=UTF-8"/><title>登录页面</title><link rel="stylesheet" th:href="@{css/bootstrap.min.css}"/><style type="text/css">body {padding-top: 50px;}.starter-template {padding: 40px 15px;text-align: center;}</style>
</head>
<body><nav class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="navbar-header"><a class="navbar-brand" href="#">Spring Security演示</a></div><div id="navbar" class="collapse navbar-collapse"><ul class="nav navbar-nav"><li><a th:href="@{/}"> 首页 </a></li></ul></div><!--/.nav-collapse --></div>
</nav>
<div class="container"><div class="starter-template"><p th:if="${param.logout}" class="bg-warning">已成功注销</p><!-- 1 --><p th:if="${param.error}" class="bg-danger">有错误,请重试</p> <!-- 2 --><h2>使用账号密码登录</h2><form name="form" th:action="@{/login}" action="/login" method="POST"> <!-- 3 --><div class="form-group"><label for="username">账号</label><input type="text" class="form-control" name="username" value="" placeholder="账号" /></div><div class="form-group"><label for="password">密码</label><input type="password" class="form-control" name="password" placeholder="密码" /></div><input type="submit" id="login" value="Login" class="btn btn-primary" /></form></div>
</div>
</body>
</html>

home.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
<meta content="text/html;charset=UTF-8"/>
<title sec:authentication="name"></title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" />
<style type="text/css">
body {padding-top: 50px;
}
.starter-template {padding: 40px 15px;text-align: center;
}
</style>
</head>
<body><nav class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="navbar-header"><a class="navbar-brand" href="#">Spring Security演示</a></div><div id="navbar" class="collapse navbar-collapse"><ul class="nav navbar-nav"><li><a th:href="@{/}"> 首页 </a></li></ul></div><!--/.nav-collapse --></div></nav><div class="container"><div class="starter-template"><h1 th:text="${msg.title}"></h1><p class="bg-primary" th:text="${msg.content}"></p><div sec:authorize="hasRole('ROLE_ADMIN')"> <!-- 用户类型为ROLE_ADMIN 显示 --><p class="bg-info" th:text="${msg.etraInfo}"></p></div><div sec:authorize="hasRole('ROLE_USER')"> <!-- 用户类型为 ROLE_USER 显示 --><p class="bg-info">无更多信息显示</p></div><form th:action="@{/logout}" method="post"><input type="submit" class="btn btn-primary" value="注销"/></form></div></div>
</body></html>

参见: JavaEE颠覆者, springboot实战
参考博客:http://blog.csdn.net/u012373815/article/details/54632176

springboot-28-security(一)用户角色控制相关推荐

  1. SpringBoot整合Security安全框架、控制权限

    我想每个写项目的人,都肯定会遇到控制权限这个问题. 例如这个这个链接只能管理员访问,那个链接丫只能超级管理员访问等等,实现方式也有多种多样,控制的粒度也不一样. 以前刚学的时候,不会框架,大都是手写注 ...

  2. springboot +security +mybatis+thymeleaf 实现简单的用户 角色 权限(资源) 管理

    1.用户 角色 资源的关系 2.实现思路 3.参考资料 Spring Boot Security   +Redis 实现简单权限控制 将返回结果变成json 响应改客户端    在第六项 4.实现代码 ...

  3. springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理

    介绍 本系统为springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理.页面为极简模式,没有任何渲染. 源码:https://gite ...

  4. Springboot + Spring Security 实现前后端分离登录认证及权限控制

    Spring Security简介 Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展 ...

  5. springboot+mybatis+SpringSecurity 实现用户角色数据库管理(一)

    本文使用springboot+mybatis+SpringSecurity 实现用户权限数据库管理 实现用户和角色用数据库存储,而资源(url)和权限的对应采用硬编码配置. 也就是角色可以访问的权限通 ...

  6. springboot整合security实现权限控制

    1.建表,五张表,如下: 1.1.用户表 CREATE TABLE `t_sys_user` (`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ...

  7. 【SSH框架/国际物流商综平台】-05 单点登录 用户-角色-权限分配 Ztree.js structs2.0 异常框架 细粒度权限控制 BaseEntitity中createby degree

    回顾 Shiro安全框架 认证,授权,加密,会话管理(单点登录),缓存,与web集成 单点登录(SSO Single Sign on)的原理 就是将原有的各个系统的会话管理机制,抽取出来交给第三方集中 ...

  8. WEB综合案例 黑马面面 day04 用户与角色绑定功能 登录用户菜单控制和权限效验

    WEB综合案例 day04 用户与角色绑定功能 登录用户菜单控制和权限效验 1. 用户与角色 思路: 根据用户去找角色的信息,然后需要用到两个表的查询,在前端页面显示信息的时候用for:each通过遍 ...

  9. springboot整合shiro,mybatis-plus实现用户角色,权限管控.(完整demo)

    资源下载链接:https://download.csdn.net/download/dayonglove2018/13960978 shiro是轻量级的权限管控框架.很早前就接触过.不过一直没有实现了 ...

  10. 系统权限控制设计001---RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

最新文章

  1. 阿里P9:架构师最根本的差距是思维!
  2. 算法训练 未名湖边的烦恼
  3. springMVC 与mybatis 整合 demo(maven 工程)
  4. Python开发一个股票类库
  5. ncurses面板库:new_panel(),doupdate(),show_panel(),hide_panel(),move_panel(),del_panel()...
  6. android远程桌面软件毕设_2019 远程桌面解决方案综述
  7. Java程序优化的一些最佳实践
  8. numpy : numpy.random
  9. 【WH】MVC数据分页扩展类
  10. 再写轮播图——两张图切换,一张充当背景并且模糊,一张做展示图
  11. android系统的官网下载地址,Android安卓10.0系统官方正式版
  12. HashMap 容量的初始化计算公式。是这样算的。请收藏
  13. LaTeX插入参考文献并引用
  14. 计算机辅助翻译技术工具,计算机辅助翻译技术对译者的影响
  15. MeteoInfoLab脚本示例:利用比湿、温度计算相对湿度
  16. 外星人电脑装linux双系统,在外星人电脑上安装windows10和ubuntu16.04双系统小记
  17. 显示一个立方体的两点透视投影图(用数组存放正方体的各顶点坐标)
  18. 剑指offer刷题总记——Java
  19. Auto.js调试:使用雷电模拟器的网络模式进行调试
  20. 基于Vue+Node的商城后台管理系统

热门文章

  1. 基于MVC的JavaScriptWeb富应用开发
  2. 他山之石 可以攻玉-《海量数据库解决方案I》
  3. 19【推荐系统18】MMoE-PosBias:多任务学习
  4. PyTorch:Encoder-RNN|LSTM|GRU
  5. 断网重启路由器就好_每天都要重启路由器?难怪WIFI越用越慢,宽带师傅透露其中窍门...
  6. python安装virtualenv_python安装virtualenv虚拟环境步骤图文详解
  7. python写ini文件_Python读写ini文件
  8. node子进程打不开php服务,mongoose,node.js_node启动服务器以后显示正常运行浏览器却打不开。,mongoose,node.js - phpStudy...
  9. centos上nginx转发tcp请求
  10. MySQL中select * for update锁表的范围