[Shiro] tutorial 1 :SecurityManager and Subject

  SecurityManager是Shiro的绝对核心,不同于java.lang.SecurityManager,每个应用程序都要有一个SecurityManager.

所以我们第一件事就是配置一个SecurityManager实例.

配置:

我们可以直接实例化SecurityManager类,Shiro的SecurityManger的实现有很多配置选项和内部组件.

可以通过文本类型的配置文件配置.Shiro提供了ini格式的配置文件.

相较于xml,ini更加易读,也无需太多依赖.

可以简单配置简单对象图,如SecurityManager.

    public static void main(String[] args) {

    log.info("My First Apache Shiro Application");

    //1.工厂模式,通过配置文件来构建工厂
    Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

    //2.通过工厂来得到SecurityManager的实例
    SecurityManager securityManager = factory.getInstance();

    //3.设置(2)中得到的实例为当前进程的SecurityManager
    SecurityUtils.setSecurityManager(securityManager);
    //4.根据(3)中的设置,getSubject()可以使用了.得到主题对象(或者称之为Shiro的‘用户‘)
    Subject currentUser = SecurityUtils.getSubject();
    //5. Shiro的session不需要HTTP环境,但能提供其相似功能以及额外的优势
    Session session = currentUser.getSession();
    session.setAttribute( "someKey", "aValue" );

Shiro will automatically use its Enterprise Session Management by default.这意味着在任何层,任意开发环境,你可以在你的程序中得到相同的API.

这打开了新世界的大门: 一些程序需要session不再被迫使用HttpSession或者EJB Stateful Session Beans.

任何客户端数据都可以共享session数据.

===我们可以获得一个Subject以及他们的Session. 以上的Subject实例代表着当前用户.

note:谁是当前用户呢?

Well, they’re anonymous - that is, until they log in at least once. So, let’s do that:

if ( !currentUser.isAuthenticated() ) {
    //collect user principals and credentials in a gui specific manner
    //such as username/password html form, X509 certificate, OpenID, etc.
    //We‘ll use the username/password example here since it is the most common.
    UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");

    //this is all you have to do to support ‘remember me‘ (no config - built in!):
    token.setRememberMe(true);

    currentUser.login(token);
}

以上是最简单的方法了.

但是登录失败了呢?可以捕捉一系列排序号的指定异常来精确诊断哪一步出问题了.

try {
    currentUser.login( token );
    //if no exception, that‘s it, we‘re done!
} catch ( UnknownAccountException uae ) {
    //username wasn‘t in the system, show them an error message?
} catch ( IncorrectCredentialsException ice ) {
    //password didn‘t match, try again?
} catch ( LockedAccountException lae ) {
    //account for that username is locked - can‘t login.  Show them a message?
}
    ... more types exceptions to check if you want ...
} catch ( AuthenticationException ae ) {
    //unexpected condition - error?
}

更多异常参考:Authentication异常的详细信息

Handy Hint:

Security best practice is to give generic login failure messages to users because you do not want to aid an attacker trying to break into your system.

Ok, so by now, we have a logged in user. What else can we do?

Let’s say who they are:

//print their identifying principal (in this case, a username):
log.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." );

We can also test to see if they have specific role or not:

if ( currentUser.hasRole( "schwartz" ) ) {
    log.info("May the Schwartz be with you!" );
} else {
    log.info( "Hello, mere mortal." );
}

We can also see if they have a permission to act on a certain type of entity:

if ( currentUser.isPermitted( "lightsaber:weild" ) ) {
    log.info("You may use a lightsaber ring.  Use it wisely.");
} else {
    log.info("Sorry, lightsaber rings are for schwartz masters only.");
}

Also, we can perform an extremely powerful instance-level permission check - the ability to see if the user has the ability to access a specific instance of a type:

if ( currentUser.isPermitted( "winnebago:drive:eagle5" ) ) {
    log.info("You are permitted to ‘drive‘ the ‘winnebago‘ with license plate (id) ‘eagle5‘.  " +
                "Here are the keys - have fun!");
} else {
    log.info("Sorry, you aren‘t allowed to drive the ‘eagle5‘ winnebago!");
}

Piece of cake, right?

Finally, when the user is done using the application, they can log out:

currentUser.logout(); //removes all identifying information and invalidates their session too.

原文地址:https://www.cnblogs.com/zienzir/p/9302221.html

时间: 2024-10-19 00:47:43

[Shiro] tutorial 1 :SecurityManager and Subject的相关文章

shiro实战系列(十)之Subject

毫无疑问,在 Apache Shiro 中最重要的概念就是 Subject.'Subject'仅仅是一个安全术语,是指应用程序用户的特定 安全的"视图".一个 Shiro Subject 实例代表了一个单一应用程序用户的安全状态和操作. 这些操作包括: authentication(login) authorization(access control) session access logout 我们原本希望把它称为"User"由于这样"很有意义&quo

Shiro遇到的SecurityManager红色警告

问题如图 需要添加一个导入 import org.apache.shiro.mgt.SecurityManager; 这样就不会报错了 原文地址:https://www.cnblogs.com/sinclairni/p/10624978.html

SpringBoot2整合Shiro报错 UnavailableSecurityManagerException: No SecurityManager accessible to the calling code 【已解决】

SpringBoot集成Shiro报错 UnavailableSecurityManagerException: No SecurityManager accessible to the calling code [已解决] 调试了好久,网上找了很多方法,,哎,太特么难受了,当知道原因的时候,,一万只草泥马在奔腾... 废话不多说,言归正传: 1.报错日志信息 org.apache.shiro.UnavailableSecurityManagerException: No SecurityMan

Shiro学习

一.概念 shiro是一个身份验证和角色管理的框架 二.用户信息配置 身份验证需要的信息(账号密码)以及角色管理(用户对应的角色)在shiro.ini的配置文件中配置,也可以选择将这两样信息放在数据库中 shiro.ini 如用户名为ly,密码为12345,角色为admin和user,则要这样配置 ly = 12345,admin,user # ============================================================================

Apache Shiro 使用手册(一)Shiro架构介绍

一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户"登录": 授权 - 访问控制: 密码加密 - 保护或隐藏数据防止被偷窥: 会话管理 - 每用户相关的时间敏感的状态. 对于任何一个应用程序,Shiro都可以提供全面的安全管理服务.并且相对于其他安全框架,Shiro要简单的多. 二.Shiro的架构介绍 首先,来了解一下Shiro的三个核心组件:Subject. Security

Shiro学习(3)授权

授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permission).角色(Role). 主体 主体,即访问应用的用户,在Shiro中使用Subject代表该用户.用户只有授权后才允许访问相应的资源. 资源 在应用中用户可以访问的任何东西,比如访问JSP页面.查看/编辑某些数据.访问某个业务方法.打印文本等等都是资源.用户只要授权后才能访问. 权限 安全策略中的原子授权

拦截404页面时tomcat抛出异常: org.apache.shiro.UnavailableSecurityManagerException

404页面中包含shiro标签,当访问404页面时,抛出异常: 原因:shiro拦截器配置缺少 标红部分,缺少红色部分导致在serverlet在拦截404页面的时候没有经过shiro  从而使shiro标签解析失败引发错误. <filter-mapping>    <filter-name>shiroFilter</filter-name>    <url-pattern>/*</url-pattern> <dispatcher>RE

Shiro 入门

Apache Shiro(http://shiro.apache.org/) 是 Java 的一个安全(权限)框架. Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境. Shiro 可以完成:认证.授权.加密.会话管理.与Web 集成.缓存等. 主要类介绍 Authentication:身份认证/登录,验证用户是不是拥有相应的身份:1. Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限:即判断用户是

shiro学习一

main方法代码 package com.java.shiro; import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.config.IniSecurityManagerFactory;import org.apach