Spring Security 说明和使用

本贴最后更新于 1814 天前,其中的信息可能已经事过境迁

springSecurity 说明

  • springSecurity 主要两大核心概念,认证、授权
  • 故名思意,认证就是校验用户是否有该路由的权限,授权是指给指定用户授予指定权限

springSecurity 使用

  • 首先我们得导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
  • 创建数据库
create database `security`; create table `user_table` ( `user_id` int unsigned not null auto_increment comment '用户id,主键', `user_name` varchar(25) not null comment '用户名', `login_name` varchar(25) not null comment '用户登录名', `login_password` varchar(255) not null comment '用户登录密码', `creator_id` int unsigned not null default '1' comment '创建者id', `create_time` timestamp not null default current_timestamp comment '创建时间戳', `role_id` int unsigned not null comment '用户权限id', primary key (user_id), unique index (create_time) ) engine = innodb default char set utf8mb4 comment '用户表'; create table `role_table` ( `role_id` int unsigned not null auto_increment comment '角色id', `role_name` varchar(25) not null comment '角色名称', `role_access` varchar(25) not null comment '角色权限', primary key (role_id) ) engine = innodb default char set utf8mb4 comment '角色权限表';
  • 添加数据
use upload_model; insert into role_table(role_name, role_access) value ('管理员', 'ADMIN'), ('普通用户', 'COMMON'), ('游客', 'GUEST'); insert into user_table (user_name, login_name, login_password, creator_id, create_time, role_id) VALUES ('admin','admin','$2a$10$Q96zmpvV4Udk81xT9ZfdbeF0zRezkHWiHt/jBIbG5391PObg2j35i',0,now(),1);
  • 创建实体类与 dao 层接口
@Data @TableName("user_table") public class UserTable implements Serializable { private static final long serialVersionUID = -515761094065624276L; /** * 用户id,主键 */ @TableId private Integer userId; /** * 用户名 */ private String userName; /** * 用户登录名 */ private String loginName; /** * 用户登录密码 */ private String loginPassword; /** * 创建者id */ private Integer creatorId; /** * 创建时间戳 */ private Date createTime; /** * 用户权限id */ private Integer roleId; } @Data @TableName("role_table") public class RoleTable implements Serializable { private static final long serialVersionUID = -2322014478068634121L; /** * 角色id */ @TableId private Integer roleId; /** * 角色名称 */ private String roleName; /** * 角色权限 */ private String roleAccess; } @Mapper @Repository public interface RoleTableDao extends BaseMapper<RoleTable> { } @Mapper @Repository public interface UserTableDao extends BaseMapper<UserTable> { }
  • 创建 WebSecurityConfigurerAdapter 的子类,并添加到容器
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true)// 可使用注解 public class CustomSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // /user/register 路由不进行拦截 http.authorizeRequests() .antMatchers("/user/register").permitAll(); // /user/loginTest 路由需要 ADMIN 权限方可访问 http.authorizeRequests() .antMatchers("/user/loginTest").hasAuthority("ADMIN"); // 开启登录页面, http.formLogin(); } }
  • 创建 UserDetailsService 的子类,并添加到容器
@Slf4j @Component public class CustomUserDetailsServiceImpl implements UserDetailsService { @Autowired UserTableDao userDao; @Autowired RoleTableDao roleDao; @Override public UserDetails loadUserByUsername(String loginName) throws UsernameNotFoundException { log.info("登录用户为:{}", loginName); UserTable user = userDao.selectOne(new QueryWrapper<UserTable>().eq("login_name", loginName)); RoleTable role = roleDao.selectById(user.getRoleId()); log.info("该用户权限为:{}", role.getRoleAccess()); return new User(loginName, user.getLoginPassword(), AuthorityUtils.commaSeparatedStringToAuthorityList(role.getRoleAccess())); } /** * 密码加密解密器 */ @Bean public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
  • 控制器
@RestController @RequestMapping("user") public class UserController { @Autowired UserTableDao userTableDao; @PostMapping("register") public String doRegister(@RequestParam("loginname") String loginName, @RequestParam("password") String passWord) { return "register Ok"; } /** * 本路由需要admin权限方可进入 */ @PreAuthorize("hasAuthority('ADMIN')") @GetMapping("noLoginTest") public String noLoginTest() { return "noLoginTest"; } @GetMapping("loginTest") public String loginTest() { return "loginTest"; } }
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    949 引用 • 1460 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 277 关注
  • 印象笔记
    3 引用 • 16 回帖 • 1 关注
  • 996
    13 引用 • 200 回帖 • 8 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 552 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 121 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 4 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 33 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    29 引用 • 230 回帖 • 128 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 2 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 29 关注
  • 自由行
    1 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 159 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 29 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    733 引用 • 1280 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 4 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 184 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 49 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 2 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    949 引用 • 1460 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖