Shiro框架从入门到实战代码(一)Shiro简介和基础应用

一:Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密和会话管理。

Authentication:身份认证/登录,验证用户是不是拥有相应的身份
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,即判断用户是否能做事情,常见的如:
验证某个用户是否拥有某个角色,或者细粒度的验证某个用户对某个资源是否具有某个权限
Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有的信息都在会话中,会话可以是普通JavaSe环境的,也可以是web环境的

Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储

Shiro有三大核心组件:
Subject:当前用户,在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中
则需要通过Subject来提供基础的当前用户信息,所有的Subject都要绑定到SecurityManager上,与Subject的交互实际上是被转换成与SecurityManager的交互
SecurityManager:即所有Subject的管理者,可以看作是Shiro框架的全局管理组件,用于调度各种Shiro框架的服务,作用类似于SpringMVC中的DispatcherServlet,用于拦截所有请求并进行处理

Realm:是用户的信息认证器和用户的权限认证器,我们需要自己实现Realm来自定义的管理我们自己系统内部的权限规则,SecurityManager要验证用户,需要从Realm中获取用户,可以把Realm看作是数据源

三者之间的联系:
一个简单的shiro应用是,应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager
我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断

Authenticator:认证器,负责主体认证的
Authrizer:授权器

public class ShiroTest {
    public static void main(String[] args) {
        Factory factory =
                new IniSecurityManagerFactory("classpath:shiro.ini");  
     //要指定读取的配置文件,返回的是一个Factory对象
        SecurityManager securityManager = factory.getInstance();
      //调用Factory的getInstance()方法获得SecurityManager
        SecurityUtils.setSecurityManager(securityManager);
 //通过SecurityUtils的setSecurityManager把SecurityManager绑定到上下文中
        Subject subject = SecurityUtils.getSubject();
  //获得与当前系统进行交互的对象
        UsernamePasswordToken token = new UsernamePasswordToken("test", "000000");
        try {
            subject.login(token);//登录操作
            if (subject.isAuthenticated()) {
                System.out.println("登录成功");
                if (subject.hasRole("admin")) {
                    System.out.println("有admin角色");
                } else {
                    System.out.println("没有admin角色");
                }
                if(subject.isPermitted("search")){
                    System.out.println("有search权限");
                }else{
                    System.out.println("没有search权限");
                }
                if(subject.isPermittedAll("del","update")){
                    System.out.println("有\"del\",\"update\"权限");
                }else{
                    System.out.println("没有\"del\",\"update\"权限");
                }
            }
        } catch (AuthenticationException e) {
            //e.printStackTrace();
            System.out.println("用户名或密码错误,登录失败");
        }
    }
}

你可能感兴趣的:(Shiro框架总结)