shiro Subject详解

什么是Subject对象
通常我们会将Subject对象理解为一个用户,同样的它也有可能是一个三方程序,它是一个抽象的概念,可以理解为任何与系统交互的“东西”都是Subject。

如何获得Subject对象
首先创建一个初始化文件

shiro.ini

[users]
root=123,admin,person
manage=123,campaign

[roles]
admin=*
person = xiaoming:*
campaign = xiaoming:drive:car
users用户

用户名=密码,角色

roles角色

角色=权限

    //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
    Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    //2、得到SecurityManager实例 并绑定给SecurityUtils
    SecurityManager securityManager = factory.getInstance();
    SecurityUtils.setSecurityManager(securityManager);
    //获得当前正在执行的subject
    Subject subject = SecurityUtils.getSubject();

获得Subject对象
Subject subject = SecurityUtils.getSubject();
通过SecurityUtils.getSubject()可以获得当前的Subject

得到Subject能干嘛
获得Session对象
Session session = subject.getSession();
session.setAttribute( “someKey”, “aValue” );
这里的Session并不是HttpSession,而是shiro为我们提供的,它的操作与HttpSession一样,他们最大的区别就是shiro session不需要依赖http服务器,下图是shiro Session的实现类。

默认情况下shiro Session的实现的是DelegatingSession,我们看一下它默认的setAttribute的实现

看一下NativeSessionManager

这里注明了这是shiro提供的本地会话工厂,如我们之前所说,它并不需要依赖于http服务器。而当我们整合HTTP服务器时,shiro Session会自动实现HttpServletSession,再来看一下HttpServletSession的实现

这里的httpSession的全包名是javax.servlet.http.HttpSession,也就是说它可以正常操作httpSession

之前说了Subject可以理解为当前用户,那么我怎么知道你是当前用户呢,当然是需要登录。

//创建一个用户
UsernamePasswordToken token = new UsernamePasswordToken(“root”,“123”);
//是否记住用户
token.setRememberMe(true);
//登录
subject.login(token);
登录失败要如何做处理呢,可以这样做处理

//登录
try {
subject.login(token);
//没有抛异常则登录成功
} catch ( UnknownAccountException uae ) {
System.out.println(“用户名不存在”);
} catch ( IncorrectCredentialsException ice ) {
System.out.println(“密码错误”);
} catch ( LockedAccountException lae ) {
System.out.println(“用户被锁定,不能登录”);
} catch ( AuthenticationException ae ) {
System.out.println(“严重的错误”);
}
得到当前登录的用户名

String currentUser = subject.getPrincipal().toString();
System.out.println(“当前登录的用户是:”+currentUser);
校验当前用户的权限

        //判断用户是否是拥有某种角色
        boolean isRole = subject.hasRole( "admin" );
        //是否拥有某种功能
        boolean isPer = subject.isPermitted("xiaoming:run");

最后是退出登录
//退出登录
subject.logout();
最终代码
    @Test
public void testSubject() {
//1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
Factory factory = new IniSecurityManagerFactory(“classpath:shiro.ini”);
//2、得到SecurityManager实例 并绑定给SecurityUtils
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//获得当前正在执行的subject
Subject subject = SecurityUtils.getSubject();
//获得shiro sessino实例
Session session = subject.getSession();
//创建一个用户
UsernamePasswordToken token = new UsernamePasswordToken(“root”,“123”);
//是否记住用户
token.setRememberMe(true);
//登录
try {
subject.login(token);
//没有抛异常则登录成功
String currentUser = subject.getPrincipal().toString();
System.out.println(“当前登录的用户是:”+currentUser);
//判断用户是否是拥有某种角色
boolean isRole = subject.hasRole( “admin” );
//是否拥有某种功能
boolean isPer = subject.isPermitted(“xiaoming:run”);
//退出登录
subject.logout();
} catch ( UnknownAccountException uae ) {
System.out.println(“用户名不存在”);
} catch ( IncorrectCredentialsException ice ) {
System.out.println(“密码错误”);
} catch ( LockedAccountException lae ) {
System.out.println(“用户被锁定,不能登录”);
} catch ( AuthenticationException ae ) {
System.out.println(“严重的错误”);
}
}
shiro.ini

[users]
root=123,admin,person
manage=123,campaign

[roles]
admin=*
person = xiaoming:*
campaign = xiaoming:drive:car
————————————————
版权声明:本文为CSDN博主「BlockCore」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21046665/article/details/79735922

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值