Shiro

什么是Shiro?

  • Apache Shiro 是一个Java 的安全(权限)框架
  • Shiro可以非常容易的开发出足够高好的应用,其不仅可以在JavaSE环境,也可以在JavaEE环境
  • Shiro可以完成,认证、授权、加密、会话管理、Web继承、缓存等
  • 下载地址:Shiro
  • 一个简单的 Java 安全框架

有哪些功能?

image-20210318123649977

  • Authentication:身份认证、登录、验证用户是不是拥有相应的身份
  • Authorization:授权,即权限验证,验证某个已认证的用户是否有某个权限,即判断用户能否进行什么操作,如:验证耨个用户是否拥有某个角色,或者细粒度的验证某一个用户对某个资源是否具有权限
  • SessionManager:会话管理,即用户登录后就是第一次会话,在没有退出之前,丫的所有信息都在会话中;会话可以是普通的JvaSE环境,也可以是Web环境;
  • Crytography:加密,保护数据的安全性,如密码加密到存储到数据库中,而不是明文存储;
  • Web Support:Web支持,可以非常容易的集成Web环境;
  • Cathing:缓存,比如用户登录后,其用户信息,拥有角色、权限不必每次去查,这样可以提高效率
  • Concurrency:Shiro支持多线程应用的并发验证,即,在一个线程中开启另一个线程,能把权限自动的转播过去
  • Testing:提供测试支持
  • Run As: 允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
  • Remember Me:记住我,这个是非常常见的功能,即登陆一次后,下次再来的话就不用登陆了。

Shiro架构(外部)

从外部来看Shiro,即从应用程序角度来管擦如何使用Shiro完成工作:

image-20210318125124094

  • subject:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject,Subject代表了当前用户,这个用户补一个ID哪个是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等,与Subkect的所有交互都会委托给SecurityManager;Subject其实是一个门面,SecurityMannager才是实际的执行者。
  • SecurityManager:安全管理器,及所有安全有关的操作都会与SecurityMangager交互,并且他管理这所有的Subject,可以看出他是Shiro的核心,他负责Shiro点其他组件进行交互,它相当于SpringMVC的DispacherServlet的角色。
  • Realm:Shiro从Realm获取安全数据(如用户,角色,权限),就是说SecurityManager眼验证用户身份,那么他需要从Realm获取响应的用户进行比较,来确定用户的身份是否合法;也需要从Realm得到用户相应的角色、权限,进行验证用户的操作是否能够进行,可以吧Realm看成DataSource。

image-20210318133032851

image-20210318133058530

依赖导入(版本)

image-20210517093901854

log4j.properties

image-20210517094021378

Shiro.ini文件

image-20210517094123684

需要ini插件 显示高亮

QuickStart

image-20210517095254982
image-20210517095620587
image-20210517095918285

SpringBoot整合Shiro环境搭建

自定义UserRealm

image-20210517101219754

创建ShiroConfig

@Qualifter(“UserRealm”)绑定创建的realm对象 指定这个域名

@Bean 交给Spring接管这个Bean,要通过Spirng把这个接管的Bean拿到就需要在这个方法里面传入这个UserRealm这个UserRealm的参数 或者在@Bean注解上@Bean( name=“userRealm”) 给一个名字 @Qualifter听过这个名字也可以绑定过来

image-20210517102728708

上面三个方法都要加@Bean 交给Spirng管理 这个类还要加一个@Configuration 在public class Shiro上加这个注解

Controller页面请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydSkuush-1624081934700)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135145.png)]

前端编写

update.html

image-20210517103552129

add.html

image-20210517103637666

image-20210517103246314

Shiro实现登陆拦截

ShiroConfig设置过滤器

添加shiro的内置过滤器

  • anon:无需认证就可以访问
  • authc:必须认证了才能访问
  • user:必须拥有记住我功能才能用
  • perms:拥有某个资源的权限才能访问
  • role:拥有某个角色才能访问

由于链式编程,new了一个LinkeHashMap<>()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dfO3nsyb-1624081934702)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135149.png)]

添加一个登录页面

image-20210517104554923

Controller 设置一个跳转到登录页面

image-20210517104436102

通配符写法

filterMap.put(“user/*”,“authc”)

Shiro实现用户认证

Controller在写一个方法验证用户的

image-20210517105641611

前端页面接受显示消息

image-20210517105525589

UserRealm进行配置认证

image-20210517110755720

Shiro整合MyBatis

导入依赖

image-20210517111203364

application.yml

用来设置一些数据源的初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcKJJMaN-1624081934705)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135156.png)]

application.properties

mybatis的配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6KjXhr8-1624081934705)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135157.png)]

编写mapper.xml文件和pojo文件,还有ServiceImpl和Service java文件

UserRealm 用户认证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YI3sMWl-1624081934706)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135158.png)]

Shiro请求授权实现

Controller添加未授权页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5L36GdpR-1624081934707)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135159.png)]

在ShiroConfig里设置未授权页面

所有的权限必须要有perms[user:add] 这个才能授权

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c265LafC-1624081934707)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135200.png)]

把权限给用户

//自定义的UserReaml  继承 extends AuthorizingRealm
public class UserReaml extends AuthorizingReaml{
    @Autowired
    UserService userService;
    
    //授权
    @Override
    protected AutorizationInfo doGetAuthorizationInfo(PrincipaCollection principals){
        SimpleAuthentication info = new SimpleAuthorizationInfo();
        info.addStringPermission("user:add");
        
        //拿到当前登录的这个对象
        Subject subject = SecurityUtils.getSubject();
        User currentUser = (User) subject.getPrincipal() //拿到User对象
        //设置当前用户权限
        info.addStringPermissions(crurentUser.getPrem())    
        return info; //接受这个对象,才能授权
    }
    
    //认证
    @Override
    protected AuthenticationInfo doGetAutothenticationInfo(AuthenticationToken token) thows AuthenticationException{
        System.out.println("执行了=> 认证doGetAuthorizationInfo");
        UsernamePasswordToken userToken = (UsernamePasswordToken) token ;
        //连接真实数据库
        User user = userService.queryUserByName(userToken.getUsername());
        if(user == null){ //没有这个人
            return null;
        }
        //可以加密 :MD5: DFSDFDSFG  MD5 盐值加密  在原来加密的基础上添加一些字符串加密
        //密码认证  shiro做  加密了
        return new SimpleAuthenticationInfo(user,user.getId(),  "");
    }
}
//授权的页面在添加
filterMap.put("user/update","prems[user:update]");

密的基础上添加一些字符串加密
//密码认证 shiro做 加密了
return new SimpleAuthenticationInfo(user,user.getId(), “”);
}
}


```java
//授权的页面在添加
filterMap.put("user/update","prems[user:update]");

总结一下项目,本次课题分为三层开发,第一层就是我们的控制层(Controller),业务层(Service)以及我们的DAO层,就是Mapper层,我们说他是数据库的接口层,专门负责调用数据库的数据提供给用户使用的,通过Mapper层,配置Mapper.xml文件来和项目中实体类和数据库的字段来一一映射,SQL语句的执行,再往下就拿到MyBatis的一个数据连接池,语句的执行就是相当于你那数据库的数据,那么整合了MyBatis框架的Spring Boot,高效运转,每当我们请求数据,MaBatis就会通过一条信息的传输密文,每一次的请求数据库,Mybatis就拿到一条数据链返回给请求数据,然后请求完成这一条数据有把这一条密文交还回给MyBatis驱动层,等下次使用的时候再拿出来交给用户,如此反复高效的执行着;拿到数据便是返回到业务层,就是service层,service层再把数据交给Controller,通过接口请求返回给客户,这就是在本次项目中对Spring Boot整合MyBatis的理解和整理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值