springboot 与 shiro 整合 (简洁版)
前言:
网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助。 有些朋友比较省事, 直接转发或者复制粘贴。但是没有经过自己键盘敲打过的代码, 不是自己的代码。所以, 我这里就来记录一个简洁版的。 不牵涉db的。 废话不多说, 开始。
一. jar包引入
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- <scope>runtime</scope>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-autoconfigure -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-autoconfigure</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-spring</artifactId>
- <version>1.4.0</version>
- </dependency>
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-ehcache</artifactId>
- <version>1.4.0</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-core</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- 由于前面的包里面不包含这个,所以要单独引入, 如果不引入, shiro的权限注解不起作用 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aspects</artifactId>
- <version>5.0.7.RELEASE</version>
- </dependency>
二. MyShiroRealm
- public class MyShiroRealm extends AuthorizingRealm {
- //角色权限和对应权限添加
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
- //获取登录用户名
- String name = (String) principalCollection.getPrimaryPrincipal();
- //添加角色和权限
- SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
- //添加角色
- simpleAuthorizationInfo.addRole("admin");
- //添加权限
- simpleAuthorizationInfo.addStringPermission("create");
- return simpleAuthorizationInfo;
- }
- //用户认证
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken atoken) throws AuthenticationException {
- UsernamePasswordToken token = (UsernamePasswordToken) atoken;
- String name = token.getUsername();
- if (name == null) {
- return null;
- }//这里验证authenticationToken和simpleAuthenticationInfo的信息
- SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(name, "123456", getName());
- return simpleAuthenticationInfo;
- }
- }
这里由于没有连接数据库, 所以一些动态的地方, 直接写死。
三. 配置文件
- @Configuration
- public class ShiroConfiguration {
- //将自己的验证方式加入容器
- @Bean
- public MyShiroRealm myShiroRealm() {
- MyShiroRealm myShiroRealm = new MyShiroRealm();
- return myShiroRealm;
- }
- //权限管理,配置主要是Realm的管理认证
- @Bean
- public org.apache.shiro.mgt.SecurityManager securityManager(CacheManager cacheManager, SessionManager sessionManager) {
- DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
- securityManager.setSessionManager(sessionManager);
- securityManager.setRealm(myShiroRealm());
- securityManager.setCacheManager(cacheManager);
- return securityManager;
- }
- //Filter工厂,设置对应的过滤条件和跳转条件
- @Bean
- public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
- ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
- shiroFilterFactoryBean.setSecurityManager(securityManager);
- Map<String,String> map = new HashMap<String, String>();
- //登出
- map.put("/logout","logout");
- map.put("/doLogin", "anon");//对所有用户认证
- map.put("/**","authc");
- //登录
- shiroFilterFactoryBean.setLoginUrl("/login");
- //首页
- shiroFilterFactoryBean.setSuccessUrl("/index");
- //错误页面,认证不通过跳转
- shiroFilterFactoryBean.setUnauthorizedUrl("/error");
- shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
- return shiroFilterFactoryBean;
- }
- //加入注解的使用,不加入这个注解不生效
- @Bean
- public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
- AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
- advisor.setSecurityManager(securityManager);
- return advisor;
- }
- @Bean
- public CacheManager cacheManager(){
- return new EhCacheManager();
- }
- @Bean
- public SessionDAO sessionDAO(){
- return new EnterpriseCacheSessionDAO();
- }
- @Bean
- public SessionManager sessionManager(SessionDAO sessionDAO){
- DefaultWebSessionManager manager = new DefaultWebSessionManager();
- manager.setSessionDAO(sessionDAO);
- manager.setGlobalSessionTimeout(3600000);
- manager.setSessionValidationInterval(3600000);
- return manager;
- }
- }
四. 控制器
- @RestController
- public class LoginController {
- @GetMapping("/login")
- public String login(){
- return "need login";
- }
- /登录
- @GetMapping("/doLogin")
- public String doLogin(String uid, String pwd){
- //添加用户认证信息
- Subject subject = SecurityUtils.getSubject();
- UsernamePasswordToken token = new UsernamePasswordToken(uid,pwd);
- try{
- //进行验证,这里可以捕获异常,然后返回对应信息
- subject.login(token);
- }
- catch(Exception e){
- return "login failed";
- }
- return "login success";
- }
- @RequestMapping(value = "/index")
- public String index(){
- return "index";
- }
- //登出
- @RequestMapping(value = "/logout")
- public String logout(){
- return "logout";
- }
- //错误页面展示
- @GetMapping("/error")
- public String error(){
- return "error ok!";
- }
- @RequiresRoles("admin")
- @RequiresPermissions("create")
- @RequestMapping(value = "/create")
- public String create(){
- return "Create success!";
- }
- @RequiresPermissions("detail")
- @RequestMapping(value = "/detail")
- public String detail(){
- return "uid";
- }
- }
到这里, 代码就敲完了。
application.yml里面, 只要两行代码:
server:
port: 8080
五. 结果检验
- 1. 访问页面: http://localhost:8080/doLogin?uid=abc&pwd=123456
2. 访问: http://localhost:8080/create
3. 访问: http://localhost:8080/detail
springboot 与 shiro 整合 (简洁版)的更多相关文章
- SpringBoot与Shiro整合权限管理实战
SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...
- SpringBoot与Shiro整合
一.数据库设计 这里主要涉及到五张表:用户表,角色表(用户所拥有的角色),权限表(角色所涉及到的权限),用户-角色表(用户和角色是多对多的),角色-权限表(角色和权限是多对多的).表结构建立的sq ...
- springboot,vue,shiro整合 关于登录认证功能
首先是session问题 传统session认证 http协议是一种无状态协议,即浏览器发送请求到服务器,服务器是不知道这个请求是哪个用户发来的.为了让服务器知道请求是哪个用户发来的,需要让用户提供用 ...
- SpringBoot:Shiro 整合 Redis
前言 前段时间做了一个图床的小项目,安全框架使用的是Shiro.为了使用户7x24小时访问,决定把项目由单机升级为集群部署架构.但是安全框架shiro只有单机存储的SessionDao,尽管Shrio ...
- 在 springboot 中如何整合 shiro 应用 ?
Shiro是Apache下的一个开源项目,我们称之为Apache Shiro. 它是一个很易用与Java项目的的安全框架,提供了认证.授权.加密.会话管理,与spring Security 一样都是 ...
- SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)
SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...
- Shiro整合springboot,freemaker,redis(含权限系统完整源码)
区块链技术联盟 2018-02-08 17:06:40 目录 一.导语 二.shiro功能介绍 三.shiro详解 四.shiro实战案例分享 五.系统配置 六.其他 一.导语 今天推荐给大家一个非常 ...
- 教你 Shiro 整合 SpringBoot,避开各种坑
教你 Shiro 整合 SpringBoot,避开各种坑-----https://www.cnblogs.com/HowieYuan/p/9259638.html
- Springboot + shiro 整合之Url拦截设置(转)
shiro 整合到springboot 还是比较简单的,只需要新建一个spring-shiro.xml的配置文件: <span style="font-size:14px;" ...
随机推荐
- ubuntu18.04时区设置
1.运行命令 sudo tzselect 2.选择大区 选择亚洲Asia,继续选择中国China,最后选择北京Beijing 3.建立软链 ln -sf /usr/share/zoneinfo/Asi ...
- 深入理解java虚拟机(一)-----java内存区域以及内存溢出异常
概述 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,J ...
- JavaScript基础视频教程总结(071-080章)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Python之xml学习笔记
XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...
- ORACLE知识点总结
一.ORACEL常用命令 1.解锁账户:ALTER USER username ACCOUNT UNLOCK; 2.查看数据库字符集:SELECT USERENV ('language') FROM ...
- .net framework 4.5 +steeltoe+ springcloud(二) 实现服务发现与调用功能
首先,写一个简单的可被调用的服务注册到服务中心,我们这命名为java-service,用的是IDEA创建一个spring boot项目,选择spring client类型. 修改application ...
- 包建强的培训课程(16):Android新技术入门和提高
@import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...
- Senparc.Weixin SDK 微信公众号 .NET 开发教程 索引
Senparc.WeixinSDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大 ...
- 微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅
本文由微信开发团队工程是由“oneliang”原创发表于WeMobileDev公众号,内容稍有改动. 1.引言 Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发( ...
- Javascript高级编程学习笔记(44)—— 动态样式
动态样式 动态样式和昨天的动态脚本一样,都是一种动态引入外部样式(脚本的方式) 由于样式是由 link 元素引入的,所以动态样式自然也就是动态生成link元素插入文档的方式 不过和动态脚本不同的是,动 ...