【springboot::】集成shiro 笔记+demo

本文深入探讨Apache Shiro权限框架的核心组件,包括Subject、SecurityManager、Realms等,阐述其认证与授权流程,并介绍Shiro的配置优势及与Spring Security的对比。同时,通过示例代码展示Shiro的使用方法。

一、
1.Subject 是与程序进行交互的对象,可以是人也可以是服务或者其他,通常就理解为用户。所有Subject 实例都必须绑定到一个SecurityManager上。我们与一个 Subject 交互,运行时shiro会自动转化为与 SecurityManager交互的特定 subject的交互。
2.SecurityManager 是 Shiro的核心,初始化时协调各个模块运行。然而,一旦 SecurityManager协调完毕,SecurityManager 会被单独留下,且我们只需要去操作Subject即可,无需操作SecurityManager 。 但是我们得知道,当我们正与一个 Subject 进行交互时,实质上是 SecurityManager在处理 Subject 安全操作.
3.Realms在 Shiro中作为应用程序和安全数据之间的“桥梁”或“连接器”。他获取安全数据来判断subject是否能够登录,subject拥有什么权限。他有点类似DAO。在配置realms时,需要至少一个realm。而且Shiro提供了一些常用的 Realms来连接数据源,如LDAP数据源的JndiLdapRealm,JDBC数据源的JdbcRealm,ini文件数据源的IniRealm,properties文件数据源的PropertiesRealm,等等。我们也可以插入自己的 Realm实现来代表自定义的数据源。 像其他组件一样,Realms也是由SecurityManager控制.

二、

  • Subject(org.apache.shiro.subject.Subject):
    简称用户

  • SecurityManager(org.apache.shiro.mgt.SecurityManager)
    如上所述,SecurityManager是shiro的核心,协调shiro的各个组件

  • Authenticator(org.apache.shiro.authc.Authenticator): Authentication Strategy
    (org.apache.shiro.authc.pam.AuthenticationStrategy)
    登录控制
    ①、如果存在多个realm,则接口AuthenticationStrategy会确定什么样算是登录成功(例如,如果一个Realm成功,而其他的均失败,是否登录成功?。

    答:①SecurityManager接口继承了Authenticator,另外还有一个ModularRealmAuthenticator实现,其委托给多个Realm进行验证,验证规则通过AuthenticationStrategy接口指定,默认提供的实现:
    ②.FirstSuccessfulStrategy:只要有一个Realm验证成功即可,只返回第一个Realm身份验证成功的认证信息,其他的忽略;
    ③.AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可,和FirstSuccessfulStrategy不同,返回所有Realm身份验证成功的认证信息;
    ④.AllSuccessfulStrategy:所有Realm验证成功才算成功,且返回所有Realm身份验证成功的认证信息,如果有一个失败就失败了。

  • Authorizer(org.apache.shiro.authz.Authorizer) :
    决定subject能拥有什么样角色或者权限

  • SessionManager(org.apache.shiro.session.SessionManager) :
    创建和管理用户session。通过设置这个管理器,shiro可以在任何环境下使用session

  • CacheManager(org.apahce.shiro.cache.CacheManager) :
    缓存管理器,可以减少不必要的后台访问。提高应用效率,增加用户体验。

  • Cryptography(org.apache.shiro.crypto.*) :
    Shiro的api大幅度简化java api中繁琐的密码加密。

  • Realms(org.apache.shiro.realm.Realm) :
    程序与安全数据的桥梁

  • Spring security 与apache shiro 差别:
    shiro配置更加容易理解,容易上手;security配置相对比较难懂。
    在spring的环境下,security整合性更好。Shiro对很多其他的框架兼容性更好,号称是无缝集成。
    shiro 不仅仅可以使用在web中,它可以工作在任何应用环境中。
    在集群会话时Shiro最重要的一个好处或许就是它的会话是独立于容器的。
    Shiro提供的密码加密使用起来非常方便
    三、

  • shiro 的 认证过程

 public class DemoApplicationTests {
       
     SimpleAccountRealm accountRealm = new SimpleAccountRealm();
        
        	@Before
        	public void addUser(){
        		accountRealm.addAccount("nigl","123456");
        	}
        	
        	@Test
        	public void testAuthticator(){
        		//构建环境
        		DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        		defaultSecurityManager.setRealm(accountRealm);
        		//提交主体认证
        		SecurityUtils.setSecurityManager(defaultSecurityManager);
        		Subject subject =SecurityUtils.getSubject();
        
        		UsernamePasswordToken token = new UsernamePasswordToken("nigl","123456");
        		//登录
        		subject.login(token);
        		System.out.println("isAuthenticatedss:"+subject.isAuthenticated());
        		//退出
        		subject.logout();
        		System.out.println("isAuthenticated:"+subject.isAuthenticated());
        
        	    }
        	}

  • shiro 授权过程
    首先构建环境,提交主体授权–> securityManager授权–>authorizer授权(授权器)–>Realm获取角色权限数据
 public class DemoApplicationTests {
    
    	SimpleAccountRealm accountRealm = new SimpleAccountRealm();
    
    	@Before
    	public void addUser(){
    	//添加账户 和 角色权限
    		accountRealm.addAccount("nigl","123456");
    	}
    	
    	@Test
    	public void testAuthticator(){
    		//构建环境
    		DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
    		defaultSecurityManager.setRealm(accountRealm);
    		//提交主体认证
    		SecurityUtils.setSecurityManager(defaultSecurityManager);
    		Subject subject =SecurityUtils.getSubject();
    
    		UsernamePasswordToken token = new UsernamePasswordToken("nigl","123456","admin","user");
    		//登录
    		subject.login(token);
    		System.out.println("isAuthenticatedss:"+subject.isAuthenticated());
    		try {
    			subject.checkRole("admin","user");
    		}catch (Exception e){
    			e.printStackTrace();
    			//会提示:org.apache.shiro.authz.UnauthorizedException: Subject does not have role [admin]
    		}
    
    	    }
    
    	}

  • shiro 的Realm,内置的Realm 有 IniRealm 和 JdbcRealm;
public class IniRealmTest {

@Test
public void testAuthticator(){
    //构建环境
    DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();

    IniRealm iniRealm = new IniRealm("classpath:user.ini");
    defaultSecurityManager.setRealm(iniRealm);
    //提交主体认证
    SecurityUtils.setSecurityManager(defaultSecurityManager);
    Subject subject =SecurityUtils.getSubject();

    UsernamePasswordToken token = new UsernamePasswordToken("nigl","123456");
    //登录
    subject.login(token);
    System.out.println("isAuthenticatedss:"+subject.isAuthenticated());
    try {
        subject.checkRoles("admin");
        subject.checkPermissions("user:delete");

    }catch (Exception e){
        e.printStackTrace();
        ////如果无权限: Subject does not have permission [user:delete1]
	    }
	}
}
user.ini 的配置文件内容

    [users]
	nigl=123456,admin
	[roles]
	admin=user:delete,user:add

四、

  • shiro 过滤器
    内置的有
    认证相关:anon(不需要认证),authc(需要认证后才可以访问),authBasic(http 认证),logout(退出),user(当前存在用户才可以访问)
    授权相关:perms[],roles[] (指定需要授权的角色),ssl,port(授权的端口)
    shiro 自定义过滤器
    五、
  • 会话管理 -->shiro Session 管理
    用户登录之后,3分钟之内可自动登录,之后需要重新登陆,下面是设置session的过期时间代码
@RequestMapping("/loginUser")
    public String loginUser(@RequestParam("username") String username,
                            @RequestParam("password") String password) {

        UsernamePasswordToken token = new UsernamePasswordToken(username, password);


        Subject subject = SecurityUtils.getSubject();
        //import org.apache.shiro.session.Session;
        Session session=subject.getSession();
        //设置session 过期时间 为 180000ms == 3 分钟
        session.setTimeout(180000);
        try {
            System.out.println("获取到信息,开始验证!!");
            subject.login(token);//登陆成功的话,放到session中
            User user = (User) subject.getPrincipal();
            session.setAttribute("user", user);
            return "redirect:index";
        } catch (Exception e) {
            e.printStackTrace();
            return "redirect:login";
        }
    }

SessionManager管理 以及 sessionDao
redis 实现共享==> 重写其增删改查等一些方法
demo 地址:https://download.youkuaiyun.com/download/lining_s/10899671
源码:https://github.com/ningL32/springbootShiro

06-22
### 得物技术栈及开发者文档分析 得物作为一家专注于潮流商品的电商平台,其技术栈和开发者文档主要围绕电商平台的核心需求展开。以下是对得物技术栈及相关开发资源的详细解析: #### 1. 技术栈概述 得物的技术栈通常会涵盖前端、后端、移动应用开发以及大数据处理等多个领域。以下是可能涉及的主要技术栈[^3]: - **前端开发**: 前端技术栈可能包括现代框架如 React 或 Vue.js,用于构建高效、响应式的用户界面。此外,还会使用 Webpack 等工具进行模块化打包和优化。 - **后端开发**: 后端技术栈可能采用 Java Spring Boot 或 Node.js,以支持高并发和分布式架构。数据库方面,MySQL 和 Redis 是常见的选择,分别用于关系型数据存储和缓存管理。 - **移动应用开发**: 得物的移动应用开发可能基于原生技术(如 Swift/Kotlin)或跨平台框架(如 Flutter)。这有助于确保移动端应用的性能和用户体验一致性。 - **大数据云计算**: 在大数据处理方面,得物可能会使用 Hadoop 或 Spark 进行数据挖掘和分析。同时,依托云服务提供商(如阿里云或腾讯云),实现弹性扩展和资源优化。 #### 2. 开发者文档分析 类似于引用中提到的 Adobe 开发者文档模板[^2],得物也可能提供一套完整的开发者文档体系,以支持内部团队协作和外部开发者接入。以下是开发者文档可能包含的内容: - **API 文档**: 提供 RESTful API 或 GraphQL 的详细说明,帮助开发者快速集成得物的功能模块,例如商品搜索、订单管理等。 - **SDK 集成指南**: 针对不同平台(如 iOS、Android 或 Web)提供 SDK 下载和集成教程,简化第三方应用的开发流程。 - **技术博客**: 分享得物在技术实践中的经验成果,例如如何优化图片加载速度、提升应用性能等。 - **开源项目**: 得物可能将部分技术成果开源,供社区开发者学习和贡献。这不仅有助于提升品牌形象,还能吸引更多优秀人才加入。 #### 3. 示例代码 以下是一个简单的示例代码,展示如何通过 RESTful API 调用得物的商品搜索功能(假设接口已存在): ```python import requests def search_items(keyword, page=1): url = "https://api.dewu.com/v1/items/search" headers = { "Authorization": "Bearer YOUR_ACCESS_TOKEN", "Content-Type": "application/json" } params = { "keyword": keyword, "page": page, "size": 10 } response = requests.get(url, headers=headers, params=params) if response.status_code == 200: return response.json() else: return {"error": "Failed to fetch data"} # 调用示例 result = search_items("Air Jordan", page=1) print(result) ``` 此代码片段展示了如何通过 Python 请求得物的 API,并获取指定关键词的商品列表。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值