入门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.authz.Authorizer)
    Authorizer是部件负责确定用户在该应用程序的访问控制。它是最终表明是否允许用户做某事的机制。像一样AuthenticatorAuthorizer还知道如何与多个后端数据源进行协调以访问角色和权限信息。在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。这允许将任何数据存储插入到会话管理基础结构中。
  • 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框架。

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 入门shiro