shiro入门

shiro的概念

在使用Shiro 之前,大家做登录,权限什么的都是五花八门,各种花里胡哨的代码,不同系统的做法很有可能千差万别。
但是使用 Shiro 这个安全框架之后,大家做权限的方式都一致化了,这样的好处就是你的代码我看起来容易,我的代码你也好理解。
Shiro 也比较成熟,基本上能满足大部分的权限需要。

shiro的配置

  1. 首先在src目录下新建shiro.ini
  2. 然后编写配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #定义用户
    [users]
    #用户名 zhang3 密码是 12345, 角色是 admin
    zhang3 = 12345, admin
    #用户名 li4 密码是 abcde, 角色是 产品经理
    li4 = abcde,productManager
    #定义角色
    [roles]
    #管理员什么都能做
    admin = *
    #产品经理只能做产品管理
    productManager = addProduct,deleteProduct,editProduct,updateProduct,listProduct
    #订单经理只能做订单管理
    orderManager = addOrder,deleteOrder,editOrder,updateOrder,listOrder

shiro使用例子

  1. User.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class User{
    private String name;
    private String password;
    public String getName(){
    return this.name;
    }
    public void setName(String name)
    {
    this.name=name;
    }

    }
  2. TestShiro.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    import java.util.ArrayList;
    import java.util.List;

    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.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;

    public class TestShiro {
    public static void main(String[] args) {
    //用户们
    User zhang3 = new User();
    zhang3.setName("zhang3");
    zhang3.setPassword("12345");

    User li4 = new User();
    li4.setName("li4");
    li4.setPassword("abcde");

    User wang5 = new User();
    wang5.setName("wang5");
    wang5.setPassword("wrongpassword");

    List<User> users = new ArrayList<>();

    users.add(zhang3);
    users.add(li4);
    users.add(wang5);
    //角色们
    String roleAdmin = "admin";
    String roleProductManager ="productManager";

    List<String> roles = new ArrayList<>();
    roles.add(roleAdmin);
    roles.add(roleProductManager);

    //权限们
    String permitAddProduct = "addProduct";
    String permitAddOrder = "addOrder";

    List<String> permits = new ArrayList<>();
    permits.add(permitAddProduct);
    permits.add(permitAddOrder);

    //登陆每个用户
    for (User user : users) {
    if(login(user))
    System.out.printf("%s \t成功登陆,用的密码是 %s\t %n",user.getName(),user.getPassword());
    else
    System.out.printf("%s \t成功失败,用的密码是 %s\t %n",user.getName(),user.getPassword());
    }

    System.out.println("------- 分割线------");

    //判断能够登录的用户是否拥有某个角色
    for (User user : users) {
    for (String role : roles) {
    if(login(user)) {
    if(hasRole(user, role))
    System.out.printf("%s\t 拥有角色: %s\t%n",user.getName(),role);
    else
    System.out.printf("%s\t 不拥有角色: %s\t%n",user.getName(),role);
    }
    }
    }
    System.out.println("-------分割线------");

    //判断能够登录的用户,是否拥有某种权限
    for (User user : users) {
    for (String permit : permits) {
    if(login(user)) {
    if(isPermitted(user, permit))
    System.out.printf("%s\t 拥有权限: %s\t%n",user.getName(),permit);
    else
    System.out.printf("%s\t 不拥有权限: %s\t%n",user.getName(),permit);
    }
    }
    }
    }

    private static boolean hasRole(User user, String role) {
    Subject subject = getSubject(user);
    return subject.hasRole(role);
    }

    private static boolean isPermitted(User user, String permit) {
    Subject subject = getSubject(user);
    return subject.isPermitted(permit);
    }

    private static Subject getSubject(User user) {
    //加载配置文件,并获取工厂
    Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    //获取安全管理者实例
    SecurityManager sm = factory.getInstance();
    //将安全管理者放入全局对象
    SecurityUtils.setSecurityManager(sm);
    //全局对象通过安全管理者生成Subject对象
    Subject subject = SecurityUtils.getSubject();

    return subject;
    }

    private static boolean login(User user) {
    Subject subject= getSubject(user);
    //如果已经登录过了,退出
    if(subject.isAuthenticated())
    subject.logout();

    //封装用户的数据
    UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getPassword());
    try {
    //将用户的数据token 最终传递到Realm中进行对比
    subject.login(token);
    } catch (AuthenticationException e) {
    //验证错误
    return false;
    }

    return subject.isAuthenticated();
    }

    }
文章作者: Anders Cao
文章链接: http://yoursite.com/2019/04/08/shiro入门/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Anders's Blog
打赏
  • 微信
  • 支付寶