Shiro|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|Shiro 入门实例】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 = https://www.it610.com/article/(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()); } } } }

    推荐阅读