shiro安全框架


Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
三个核心组件: Subject, SecurityManagerRealms.

  • Subject:当前用户,Subject 可以是一个人,但也可以是第三方服务、守护进程帐户、时钟守护任务或者其它–当前和软件交互的任何事件。
  • SecurityManager:管理所有Subject,SecurityManager 是 Shiro 架构的核心,配合内部安全组件共同组成安全伞。
  • Realms:用于进行权限信息的验证,我们自己实现。Realm 本质上是一个特定的安全DAO:它封装与数据源连接的细节,得到Shiro 所需的相关的数据。在配置 Shiro 的时候,你必须指定至少一个Realm 来实现认证(authentication)和/或授权(authorization)。

1. shiro认证

public class SimpleRealmTest0 {

    SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();

    @Before
    // 1、仅仅添加一个用户名密码
    public void addUser() {
        simpleAccountRealm.addAccount("Mark", "123456");
    }

    @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("Mark", "123456");
        subject.login(token);
        System.out.println("是否登录:" + subject.isAuthenticated());

        subject.logout();
        System.out.println("是否登录:" + subject.isAuthenticated());
    }
}

结果:

是否登录:true
14:31:56.098 [main] DEBUG o.a.shiro.mgt.DefaultSecurityManager - Logging out subject with primary principal Mark
14:31:56.099 [main] DEBUG o.a.s.s.mgt.AbstractSessionManager - Stopping session with id [92bc965b-1884-4b8f-96cd-8e48afaad6aa]
是否登录:false

参考:https://blog.csdn.net/ztchun/article/details/80330711

2. 授权

public class SimpleRealmTest {

    SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();

    @Before
    public void addUser() {
        simpleAccountRealm.addAccount("Mark", "123456", "admin");
    }

    @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("Mark", "123456");
        subject.login(token);
        System.out.println("是否登录:" + subject.isAuthenticated());

        subject.checkRoles("admin"); //授权

        subject.logout();
        System.out.println("是否登录:" + subject.isAuthenticated());
    }
}

上述 subject.checkRoles("admin"); //授权 如果没有权限则直接抛出异常。

realm

上述认证和授权两个demo使用的是realm仅仅用于测试。下边介绍两种内置realm。

两种内置realm

  • iniRealm
  • jdbcRealm

1.iniRealm

从配置文件中读权限

public class IniRealmTest {

    IniRealm iniRealm = new IniRealm("classpath:user.ini");

    @Test
    public void testIniRealm() {
        // 1.构建SecurityManager环境
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(iniRealm);

        // 2.主题提交认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();

        UsernamePasswordToken token = new UsernamePasswordToken("Mark", "123456");
        subject.login(token);
        System.out.println("是否登录:" + subject.isAuthenticated());

        subject.checkRoles("admin"); //授权
        subject.checkPermission("user:delete");

        subject.logout();
        System.out.println("是否登录:" + subject.isAuthenticated());
    }
}

上述不同的地方:

IniRealm iniRealm = new IniRealm("classpath:user.ini");
defaultSecurityManager.setRealm(iniRealm);

其中配置文件放在Resource文件夹下即可。
user.ini

[users]
\#提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2
Mark=123456,admin
[roles]
\#提供了角色及权限之间关系的配置,角色=权限1,权限2
admin=user:delete

提供了一个用户名为Mark的用户,密码123456,角色是admin,他的权限有user:delete

2. jdbcRealm

暂时略。


自定义realm。

加密

  • 加密 md5
  • 加盐

springboot整合shiro

参考:
http://www.ityouknow.com/springboot/2017/06/26/spring-boot-shiro.html
https://www.cnblogs.com/learnhow/p/9747134.html
https://github.com/whbing/shiro-security

利用拦截器,将需要认证的url拦截。

Shiro 配置

两种方式。使用配置类,或者spring注入xml方式都可以。

  • 配置类
  • xml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值