springboot-28-security(一)用户角色控制
spring security 使用众多的拦截器实现权限控制的, 其核心有2个重要的概念: 认证(Authentication) 和授权 (Authorization)), 认证就是确认用户可以访问当前系统, 授权即确定用户有相应的权限,
项目 使用 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相关配置
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>
springboot-28-security(一)用户角色控制相关推荐
- SpringBoot整合Security安全框架、控制权限
我想每个写项目的人,都肯定会遇到控制权限这个问题. 例如这个这个链接只能管理员访问,那个链接丫只能超级管理员访问等等,实现方式也有多种多样,控制的粒度也不一样. 以前刚学的时候,不会框架,大都是手写注 ...
- springboot +security +mybatis+thymeleaf 实现简单的用户 角色 权限(资源) 管理
1.用户 角色 资源的关系 2.实现思路 3.参考资料 Spring Boot Security +Redis 实现简单权限控制 将返回结果变成json 响应改客户端 在第六项 4.实现代码 ...
- springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理
介绍 本系统为springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理.页面为极简模式,没有任何渲染. 源码:https://gite ...
- Springboot + Spring Security 实现前后端分离登录认证及权限控制
Spring Security简介 Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展 ...
- springboot+mybatis+SpringSecurity 实现用户角色数据库管理(一)
本文使用springboot+mybatis+SpringSecurity 实现用户权限数据库管理 实现用户和角色用数据库存储,而资源(url)和权限的对应采用硬编码配置. 也就是角色可以访问的权限通 ...
- springboot整合security实现权限控制
1.建表,五张表,如下: 1.1.用户表 CREATE TABLE `t_sys_user` (`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ...
- 【SSH框架/国际物流商综平台】-05 单点登录 用户-角色-权限分配 Ztree.js structs2.0 异常框架 细粒度权限控制 BaseEntitity中createby degree
回顾 Shiro安全框架 认证,授权,加密,会话管理(单点登录),缓存,与web集成 单点登录(SSO Single Sign on)的原理 就是将原有的各个系统的会话管理机制,抽取出来交给第三方集中 ...
- WEB综合案例 黑马面面 day04 用户与角色绑定功能 登录用户菜单控制和权限效验
WEB综合案例 day04 用户与角色绑定功能 登录用户菜单控制和权限效验 1. 用户与角色 思路: 根据用户去找角色的信息,然后需要用到两个表的查询,在前端页面显示信息的时候用for:each通过遍 ...
- springboot整合shiro,mybatis-plus实现用户角色,权限管控.(完整demo)
资源下载链接:https://download.csdn.net/download/dayonglove2018/13960978 shiro是轻量级的权限管控框架.很早前就接触过.不过一直没有实现了 ...
- 系统权限控制设计001---RBAC用户角色权限设计方案
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...
最新文章
- 阿里P9:架构师最根本的差距是思维!
- 算法训练 未名湖边的烦恼
- springMVC 与mybatis 整合 demo(maven 工程)
- Python开发一个股票类库
- ncurses面板库:new_panel(),doupdate(),show_panel(),hide_panel(),move_panel(),del_panel()...
- android远程桌面软件毕设_2019 远程桌面解决方案综述
- Java程序优化的一些最佳实践
- numpy : numpy.random
- 【WH】MVC数据分页扩展类
- 再写轮播图——两张图切换,一张充当背景并且模糊,一张做展示图
- android系统的官网下载地址,Android安卓10.0系统官方正式版
- HashMap 容量的初始化计算公式。是这样算的。请收藏
- LaTeX插入参考文献并引用
- 计算机辅助翻译技术工具,计算机辅助翻译技术对译者的影响
- MeteoInfoLab脚本示例:利用比湿、温度计算相对湿度
- 外星人电脑装linux双系统,在外星人电脑上安装windows10和ubuntu16.04双系统小记
- 显示一个立方体的两点透视投影图(用数组存放正方体的各顶点坐标)
- 剑指offer刷题总记——Java
- Auto.js调试:使用雷电模拟器的网络模式进行调试
- 基于Vue+Node的商城后台管理系统
热门文章
- 基于MVC的JavaScriptWeb富应用开发
- 他山之石 可以攻玉-《海量数据库解决方案I》
- 19【推荐系统18】MMoE-PosBias:多任务学习
- PyTorch:Encoder-RNN|LSTM|GRU
- 断网重启路由器就好_每天都要重启路由器?难怪WIFI越用越慢,宽带师傅透露其中窍门...
- python安装virtualenv_python安装virtualenv虚拟环境步骤图文详解
- python写ini文件_Python读写ini文件
- node子进程打不开php服务,mongoose,node.js_node启动服务器以后显示正常运行浏览器却打不开。,mongoose,node.js - phpStudy...
- centos上nginx转发tcp请求
- MySQL中select * for update锁表的范围