zoukankan      html  css  js  c++  java
  • shiro的helloworld

    shiro是一个java的安全认证框架,主要用户管理用户的登录,用户登录之后的权限,用户登录之后具有哪些角色和权限,能够访问哪些菜单,点击哪些按钮等操作。

    shiro的session管理,不仅仅支持在web环境下的session管理,还支持在非web环境的session管理。接下来 ,我们来看下面一个简单的java 工程,通过项目来了解shiro

    我们首先来看下工程截图的代码:

     这是一个简单的hellworld是一个java的工程项目:首先需要创建一个shiro的配置文化

    shiro.ini在该配置文件中,是用来便于测试使用,在里面配置用户名和密码,用户对应的角色。用户对于的权限等

    #
    # Licensed to the Apache Software Foundation (ASF) under one
    # or more contributor license agreements.  See the NOTICE file
    # distributed with this work for additional information
    # regarding copyright ownership.  The ASF licenses this file
    # to you under the Apache License, Version 2.0 (the
    # "License"); you may not use this file except in compliance
    # with the License.  You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing,
    # software distributed under the License is distributed on an
    # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    # KIND, either express or implied.  See the License for the
    # specific language governing permissions and limitations
    # under the License.
    #
    # =============================================================================
    # Quickstart INI Realm configuration
    #
    # For those that might not understand the references in this file, the
    # definitions are all based on the classic Mel Brooks' film "Spaceballs". ;)
    # =============================================================================
    
    # -----------------------------------------------------------------------------
    # Users and their assigned roles
    #
    # Each line conforms to the format defined in the
    # org.apache.shiro.realm.text.TextConfigurationRealm#setUserDefinitions JavaDoc
    # -----------------------------------------------------------------------------
    [users]
    # user 'root' with password 'secret' and the 'admin' role
    root = secret, admin
    # user 'guest' with the password 'guest' and the 'guest' role
    guest = guest, guest
    # user 'presidentskroob' with password '12345' ("That's the same combination on
    # my luggage!!!" ;)), and role 'president'
    presidentskroob = 12345, president
    # user 'darkhelmet' with password 'ludicrousspeed' and roles 'darklord' and 'schwartz'
    darkhelmet = ludicrousspeed, darklord, schwartz
    # user 'lonestarr' with password 'vespa' and roles 'goodguy' and 'schwartz'
    lonestarr = vespa, goodguy, schwartz
    
    # -----------------------------------------------------------------------------
    # Roles with assigned permissions
    # 
    # Each line conforms to the format defined in the
    # org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc
    # -----------------------------------------------------------------------------
    [roles]
    # 'admin' role has all permissions, indicated by the wildcard '*'
    admin = *
    # The 'schwartz' role can do anything (*) with any lightsaber:
    schwartz = lightsaber:*
    # The 'goodguy' role is allowed to 'delete' (action) the user (type) with
    # license plate 'zhangsan' (instance specific id)
    goodguy = user:delete:zhangsan

    接下来我们在quickstart.java代码中对shiro.ini中配置的参数进行验证和校验

    我们来看下程序的代码:

    package com.atguigu.shiro.helloworld;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.*;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.session.Session;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    /**
     * Simple Quickstart application showing how to use Shiro's API.
     *
     * @since 0.9 RC2
     */
    public class Quickstart {
    
        private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class);
    
    
        public static void main(String[] args) {
    
            // The easiest way to create a Shiro SecurityManager with configured
            // realms, users, roles and permissions is to use the simple INI config.
            // We'll do that by using a factory that can ingest a .ini file and
            // return a SecurityManager instance:
    
            // Use the shiro.ini file at the root of the classpath
            // (file: and url: prefixes load from files and urls respectively):
            Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
            SecurityManager securityManager = factory.getInstance();
    
            // for this simple example quickstart, make the SecurityManager
            // accessible as a JVM singleton.  Most applications wouldn't do this
            // and instead rely on their container configuration or web.xml for
            // webapps.  That is outside the scope of this simple quickstart, so
            // we'll just do the bare minimum so you can continue to get a feel
            // for things.
            SecurityUtils.setSecurityManager(securityManager);
    
            // Now that a simple Shiro environment is set up, let's see what you can do:
    
            // get the currently executing user:
            // 获取当前的 Subject. 调用 SecurityUtils.getSubject();
            Subject currentUser = SecurityUtils.getSubject();
    
            // Do some stuff with a Session (no need for a web or EJB container!!!)
            // 测试使用 Session 
            // 获取 Session: Subject#getSession()
            Session session = currentUser.getSession();
            session.setAttribute("someKey", "aValue");
            String value = (String) session.getAttribute("someKey");
            if (value.equals("aValue")) {
                log.info("---> Retrieved the correct value! [" + value + "]");
            }
    
            // let's login the current user so we can check against roles and permissions:
            // 测试当前的用户是否已经被认证. 即是否已经登录. 
            // 调动 Subject 的 isAuthenticated() 
            if (!currentUser.isAuthenticated()) {
                // 把用户名和密码封装为 UsernamePasswordToken 对象
                UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
                // rememberme
                token.setRememberMe(true);
                try {
                    // 执行登录. 
                    currentUser.login(token);
                } 
                // 若没有指定的账户, 则 shiro 将会抛出 UnknownAccountException 异常. 
                catch (UnknownAccountException uae) {
                    log.info("----> There is no user with username of " + token.getPrincipal());
                    return; 
                } 
                // 若账户存在, 但密码不匹配, 则 shiro 会抛出 IncorrectCredentialsException 异常。 
                catch (IncorrectCredentialsException ice) {
                    log.info("----> Password for account " + token.getPrincipal() + " was incorrect!");
                    return; 
                } 
                // 用户被锁定的异常 LockedAccountException
                catch (LockedAccountException lae) {
                    log.info("The account for username " + token.getPrincipal() + " is locked.  " +
                            "Please contact your administrator to unlock it.");
                }
                // ... catch more exceptions here (maybe custom ones specific to your application?
                // 所有认证时异常的父类. 
                catch (AuthenticationException ae) {
                    //unexpected condition?  error?
                }
            }
    
            //say who they are:
            //print their identifying principal (in this case, a username):
            log.info("----> User [" + currentUser.getPrincipal() + "] logged in successfully.");
    
            //test a role:
            // 测试是否有某一个角色. 调用 Subject 的 hasRole 方法. 
            if (currentUser.hasRole("schwartz")) {
                log.info("----> May the Schwartz be with you!");
            } else {
                log.info("----> Hello, mere mortal.");
                return; 
            }
    
            //test a typed permission (not instance-level)
            // 测试用户是否具备某一个行为. 调用 Subject 的 isPermitted() 方法。 
            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.");
            }
    
            //a (very powerful) Instance Level permission:
            // 测试用户是否具备某一个行为. 
            if (currentUser.isPermitted("user:delete:zhangsan")) {
                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!");
            }
    
            //all done - log out!
            // 执行登出. 调用 Subject 的 Logout() 方法. 
            System.out.println("---->" + currentUser.isAuthenticated());
            
            currentUser.logout();
            
            System.out.println("---->" + currentUser.isAuthenticated());
    
            System.exit(0);
        }
    }

    上面就是一个简单的helloword

    原理分析如下所示

     

  • 相关阅读:
    Postman使用教程
    CAD和ArcGIS转换 矢量配准
    SAP CRM Advanced search和Simple search里Max hit表现行为的差异
    SAP CRM Product simple search的启用步骤
    如何快速定位SAP CRM订单应用(Order Application)错误消息抛出的准确位置
    如何动态修改SAP CRM WebClient UI表格栏的宽度
    如何在SAP CRM WebClient UI里创建web service并使用ABAP消费
    如何处理SAP CRM Web Service错误
    如何使用SAP CRM WebClient UI实现一个类似新浪微博的字数统计器
    如何开启SAP CRM基于WORD模板创建附件的功能
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/9739933.html
Copyright © 2011-2022 走看看