shiro入门

本篇文章来自慕课网Shiro安全框架入门视频教程,以下内容为作者观看视频后总结内容。

一、什么是Shiro

  • Apache下的一个强大灵活的开源安全框架
  • 认证、授权、企业会话管理、安全加密
  • 可以帮助快速完成权限管理模块的开发
二、Shiro与Spring Security比较
  • 前者简单、灵活-----------后者复杂、笨重
  • 前者可以脱离spring------后者不可脱离spring
  • 前者权限控制粒度较粗--后者权限控制力度较细
三、Shiro架构图
    Shiro通过security Manager管理。
    Authenticator:认证器,管理登入与登出。
    Authorizer:授权器,赋予主体拥有哪些权限
    Session Manager:会话管理器
    Session Dao:提供session操作,包括增删改查
    Cache Manager:缓存管理器
四、Shiro认证
1、首先生成一个简单的认证代码,如下。
public class AuthenticationTest {

    SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
    
    @Before
    public void add(){
        simpleAccountRealm.addAccount("yxf", "123");
    }
    
    @Test
    public void testAuthentication(){
        //1.构建SecurityManager环境
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(simpleAccountRealm);
        
        //2.主体提交认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();
        
        UsernamePasswordToken token = new UsernamePasswordToken("yxf", "123");
        subject.login(token);
        
        System.out.println("isAuthenticated:" + subject.isAuthenticated());
        
    }
}

在上面代码中可见的认证过程,

  1、创建一个Realm,并将用户名与密码添加进去。

  2、构建SecurityManager环境,将Realm放入安全管理环境中。

  3、接收主体提交来的认证请求(这里我们为了方便测试使用手动创建的token)。

  4、对请求进行认证。

认证结果:

  1、用户已登录:方法将返回true。

  2、用户未登录:方法将返回false。

  2、用户名不正确:在login方法中,程序将抛出异常org.apache.shiro.authc.UnknownAccountException(未知的用户)。

  3、密码不正确:在login方法中,程序将抛出异常org.apache.shiro.authc.IncorrectCredentialsException(非法凭证)。

  4、用户名密码都不正确:同2.

五、Shiro授权

生成一个简单授权代码,如下

public class AuthenticationTest {

    SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
    
    @Before
    public void add(){
        simpleAccountRealm.addAccount("yxf", "123", "admin", "user");
    }
    
    @Test
    public void testAuthentication(){
        //1.构建SecurityManager环境
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(simpleAccountRealm);
        
        //2.主体提交认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();
        
        UsernamePasswordToken token = new UsernamePasswordToken("yxf", "123");
        subject.login(token);
        
        //认证
        System.out.println("isAuthenticated:" + subject.isAuthenticated());
        
        //授权角色
        subject.checkRole("admin");
        subject.checkRole("user");
        subject.checkRoles("admin", "user");
        //授权用户
        subject.checkPermission("select");
        subject.checkPermissions("select","update");
    }
}

如上代码中,用户首先经过认证,认证通过,可以进行授权,授权分为角色授权与权限授权。可以一次检查一个角色/权限授权,也可以一次检查多个。如果检查授权不存在,程序将抛出如下异常:

org.apache.shiro.authz.UnauthorizedException: Subject does not have role [user2](无法授权,找不到“user2”角色)

org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [select](无法授权,找不到"select"权限)

六、Realm

Shiro无论是认证还是授权,都需要从Realm中获取数据。

Realm接口中有如下三个接口:

public interface Realm {

    String getName();

    boolean supports(AuthenticationToken token);

    AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException;

}

Realm的体系结构:

一般情况下,最常用的Realm实现类为IniRealm,JdbcRealm以及PropertiesRealm。

IniRealm:

 

 

我们自定义Realm只需继承AuthorizingRealm(授权)抽象接口,因为该接口已经继承了AuthenticatingRealm(认证)和CachingRealm(缓存)。

 

 

posted @ 2018-05-03 16:33  一响贪欢  阅读(246)  评论(0编辑  收藏  举报