Shiro 入门实例

首先创建一个空 Maven 工程:略

添加依赖

在pom.xml中加入jar包的配置:


    
    
        org.apache.shiro
        shiro-core
        1.2.3
    
    
    
        org.slf4j
        slf4j-log4j12
        1.6.1
    
    
        org.slf4j
        slf4j-api
        1.6.1
    

配置文件

log4j.properties

log4j.rootLogger=INFO, stdout, 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

shiro.ini

#用户名=密码,角色1,角色2...,角色n
[users]
root = secret, admin
guest = guest, guest
test = 123456, role1, role2
# -----------------------------------------------------------------------------
# Roles with assigned permissions
# roleName = perm1, perm2, ..., permN
# 角色名=权限1,权限2...权限n
# -----------------------------------------------------------------------------
[roles]
admin = *
guest = guest
role1=perm1,perm2
role2=perm3
配置说明:
  • 配置文件中包含两个部分用户[users]和角色[roles]
  • 用户配置的格式是:
    用户名=密码,角色1,角色2,...角色n
    如:test=123456,role1,role2
    用户名是 test,密码是123456,拥有两个角色role1和role2
  • 一个用户可以具有多个角色。注意逗号是英文的。
  • 角色配置的格式是:
    角色名=权限1,权限2…权限n
    如:
    role1=perm1,perm2
    角色名是role1,拥有perm1和perm2两个权限。

测试代码

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;


public class ShiroTest {
    private static final transient Logger log =
            LoggerFactory.getLogger(ShiroTest.class);

    public static void main(String[] args) {
        //1. 这里的SecurityManager是org.apache.shiro.mgt.SecurityManager
        // 而不是java.lang.SecurityManager
        // 加载配置文件
        Factory factory =
                new IniSecurityManagerFactory("classpath:shiro.ini");
        //2.解析配置文件,并且返回一些SecurityManger实例
        SecurityManager securityManager = factory.getInstance();
        //3.将SecurityManager绑定给SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);
        // 安全操作,Subject是当前登录的用户
        Subject currentUser = SecurityUtils.getSubject();

        // 测试在应用的当前会话中设置属性
        Session session = currentUser.getSession();
        //放进去一个key和一个value
        session.setAttribute("someKey", "aValue");
        //根据key拿到value
        String value = (String) session.getAttribute("someKey");
        if ("aValue".equals(value)) {//比较拿到的值和原来的值是否一致
            log.info("检索到正确的值[" + value + "]");
        }
        //尝试进行登录用户,如果登录失败了,我们进行一些处理
        if (!currentUser.isAuthenticated()) {//如果用户没有登录过
            //new UsernamePasswordToken(用户名,密码)
            UsernamePasswordToken token =
                    new UsernamePasswordToken("test", "123456");
            token.setRememberMe(true);//是否记住用户
            try {
                currentUser.login(token);
                //当我们获登录用户之后
                log.info("用户 [" + currentUser.getPrincipal() + "] 登陆成功");
                // 查看用户是否有指定的角色
                if (currentUser.hasRole("admin")) {
                    log.info("您有admin角色");
                } else {
                    log.info("您没有admin角色");
                }
                if (currentUser.hasRole("role1")) {
                    log.info("您有role1角色");
                } else {
                    log.info("您没有role1角色");
                }

                // 查看用户是否有某个权限
                if (currentUser.isPermitted("perm1")) {
                    log.info("您有perm1权限");
                } else {
                    log.info("您没有perm1权限");
                }
                if (currentUser.isPermitted("guest")) {
                    log.info("您有guest权限");
                } else {
                    log.info("您没有guest权限");
                }
                //登出
                currentUser.logout();
            } catch (UnknownAccountException uae) {
                log.info(token.getPrincipal() + "账户不存在");
            } catch (IncorrectCredentialsException ice) {
                log.info(token.getPrincipal() + "密码不正确");
            } catch (LockedAccountException lae) {
                log.info(token.getPrincipal() + "用户被锁定了 ");
            } catch (AuthenticationException ae) {
                //无法判断是什么错了
                log.info(ae.getMessage());
            }
        }
    }
}

你可能感兴趣的:(Shiro 入门实例)