-
入门shiro
Shiro
官方定义:Apache Shiro的首要目标是易于使用和理解。安全有时会非常复杂,甚至会很痛苦,但并非必须如此。框架应尽可能掩盖复杂性,并公开干净直观的API,以简化开发人员确保其应用程序安全的工作。
您可以使用Apache Shiro进行以下操作:
-
验证用户身份以验证其身份
-
对用户执行访问控制,例如:
- 确定是否为用户分配了特定的安全角色
- 确定是否允许用户做某事
-
即使在没有Web或EJB容器的情况下,也可以在任何环境中使用Session API。
-
在身份验证,访问控制或会话的生存期内对事件做出反应。
-
汇总1个或更多用户安全数据的数据源,并将其全部显示为单个复合用户“视图”。
-
启用单点登录(SSO)功能
-
启用“记住我”服务以进行用户关联,而无需登录
…
Shiro的核心体系结构概念
-
主题(
org.apache.shiro.subject.Subject
)
当前与软件交互的实体(用户,第三方服务,计划任务等)的特定于安全性的“视图”。 -
SecurityManager(org.apache.shiro.mgt.SecurityManager)
如上所述,这SecurityManager
是Shiro体系结构的核心。它主要是一个“伞”对象,用于协调其托管组件以确保它们能够顺利协同工作。它还管理Shiro对每个应用程序用户的视图,因此它知道如何对每个用户执行安全性操作。 -
认证器(org.apache.shiro.authc.Authenticator)
的Authenticator
是,负责执行和用户反应,以验证(登录)的尝试的组件。当用户尝试登录时,该逻辑由执行Authenticator
。该Authenticator
知道如何与一个或多个协调Realms
该商店相关的用户/帐户信息。从这些数据中获得的数据Realms
用于验证用户的身份,以确保用户确实是他们所说的真实身份。-
认证策略(org.apache.shiro.authc.pam.AuthenticationStrategy)
如果Realm
配置了多个认证策略,则AuthenticationStrategy
它将协调领域,以确定认证尝试成功或失败的条件(例如,一个领域成功但其他领域失败) ,尝试是否成功?所有领域都必须成功吗?只有第一个领域?)。
-
认证策略(org.apache.shiro.authc.pam.AuthenticationStrategy)
-
认证器(org.apache.shiro.authz.Authorizer)
的Authorizer
是部件负责确定用户在该应用程序的访问控制。它是最终表明是否允许用户做某事的机制。像一样Authenticator
,Authorizer
还知道如何与多个后端数据源进行协调以访问角色和权限信息。在Authorizer
使用该信息来准确确定是否允许用户执行特定的操作。 -
SessionManager(org.apache.shiro.session.mgt.SessionManager)
将SessionManager
知道如何创建和管理用户Session
生命周期,提供在所有环境中的用户强大的会话体验。这是安全框架领域中的一项独特功能-Shiro能够在任何环境中本地管理用户会话,即使没有Web / Servlet或EJB容器也可以。默认情况下,Shiro将使用现有的会话机制(例如Servlet容器)(如果可用),但是如果没有这种机制,例如在独立应用程序或非Web环境中,它将使用其内置的企业会话管理来提供相同的编程经验。的SessionDAO
存在允许任何数据源被用来坚持的会议。-
SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
的SessionDAO
执行Session
持久代(CRUD)操作SessionManager
。这允许将任何数据存储插入到会话管理基础结构中。
-
SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
-
CacheManager的(org.apache.shiro.cache.CacheManager)
的CacheManager
创建和管理Cache
其他四郎组件使用实例的生命周期。因为Shiro可以访问许多后端数据源以进行身份验证,授权和会话管理,所以缓存一直是框架中的一流架构功能,可以在使用这些数据源时提高性能。可以将任何现代的开源和/或企业缓存产品插入Shiro,以提供快速有效的用户体验。 -
密码术(org.apache.shiro.crypto。*)
密码术是企业安全框架的自然补充。 Shiro的crypto
软件包包含易于使用和理解的密码学密码,哈希(又名摘要)和不同编解码器实现的表示形式。该软件包中的所有类都经过精心设计,以使其易于使用和易于理解。使用Java的本机加密技术支持的任何人都知道,驯服它可能是具有挑战性的动物。 Shiro的加密API简化了复杂的Java机制,并使普通人容易使用加密。 -
领域(org.apache.shiro.realm.Realm)
如上所述,领域充当Shiro与应用程序的安全数据之间的“桥梁”或“连接器”。当真正需要与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从一个或多个为应用程序配置的领域中查找许多此类内容。您可以根据Realms
需要配置任意数量(通常每个数据源一个),并且Shiro会根据需要与它们进行协调,以进行身份验证和授权。这里我们就先做一个简单的入门:(整合spring boot)
#这里就把shiro的核心代码放进来,其余的就是简单的springboot 项目,视图层 +控制层+数据库层,完成业务的跳转,页面显示以及数据库的增删改查等等基础
ShiroConfig
@Configuration
public class ShiroConfig {
//第三步:ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);
/*
* anon:无需认证就可以访问
* authc:必须认证才能访问
* user: 必须拥有 记住我 功能才能用
* perms: 拥有对某个资源的权限才能访问
* role: 拥有某个角色权限才能访问
* */
Map<String, String> filterMap = new LinkedHashMap<>();
//授权,正常情况下,未授权会跳转到未授权页面
//在这我们如果要改变是角色权限还是对某个资源的访问权限,需要在UserRealm类中去获取XXXX
// /XXXXX/XXXX是业务请求的路径
filterMap.put("/XXXXX/XXXX","roles[supermanager]");
filterMap.put("/XXXXX/XXXX","roles[manager]");
//注销
filterMap.put("/logout","logout");
bean.setFilterChainDefinitionMap(filterMap);
//未授权的请求
bean.setUnauthorizedUrl("/noauthorized");
//设置登录的请求
bean.setLoginUrl("/toLogin");
return bean;
}
//第二步:DefaultWebSecurityManager
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联userRealm
securityManager.setRealm(userRealm);
return securityManager;
}
//第一步:创建realm,需要自定义
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//整合shiroDialect:用来整合shiro thymeleaf
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}
UserRealm
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//拿到当前登录的这个对象
Subject subject = SecurityUtils.getSubject();
User currentUser = (User) subject.getPrincipal();//拿到user对象
//拿到当前登录用户的角色,注意不管是拿role还是perms,那么数据库中都应该有这么一个字段信息保存想要的数据
info.addRole(currentUser.getRole());
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken userToken = (UsernamePasswordToken)token;
//用户名:密码 数据库中取
User user = userService.queryUserByName(userToken.getUsername());
System.out.println(userToken.getUsername());
//(userToken.getUsername().equals(user.getName()))==false 没解决这个问题
if (user==null){
return null;//抛出异常 用户名不存在
}
Subject currentSubjec = SecurityUtils.getSubject();
Session session = currentSubjec.getSession();
session.setAttribute("loginUser",user);
//密码认证,shiro做
return new SimpleAuthenticationInfo(user,user.getPwd(),"");
}
}
当然除了这些,还有记住我,缓存管理,等等很多功能,在我们初步了解shiro后,可以自己再去自我学习,这将会使我们更好的理解和学习shiro框架。
原文:https://www.cnblogs.com/haotian6/p/14813921.html