shiro角色与权限

shiro角色与权限

shiro在认证过程中,会判断该用户是否含有一定的权限或者角色,其中位于顶层的接口为AuthorizationInfo,其继承体系如下:

AuthorizationInfo:为用户在认证的过程中,会将相应的角色与权限封装到AuthorizationInfo中,后面会根据该信息进行权限与角色的校验。其中AuthorizationInfo主要封装了如下三个方法:

public interface AuthorizationInfo extends Serializable {

    /**
     * 返回分配给相应主题的所有角色的名称。
     */
    Collection<String> getRoles();

    /**
     * 返回对应主体的所有的权限
     */
    Collection<String> getStringPermissions();

    /**
     * 返回权限
     */
    Collection<Permission> getObjectPermissions();

SimpleAuthorizationInfo:为AuthorizationInfo的默认建单实现,封装了角色与权限。

SimpleAccount:除了含有用户角色与权限的信息外,添加了用户主体的信息,如:账号与密码

shiro用户主体

用户主体的校验顶级接口为AuthenticationInfo,其继承体系关系如下:

SimpleAuthenticationInfo:里面封装了用户的主体身份和主体的凭证等信息

shiro权限和角色认证示例代码如下

drop table if EXISTS users;

create table users (
                       id int auto_increment,
                       username varchar(20),
                       password varchar(20),
                       password_salt varchar(20),
                       constraint pk_users primary key(id)
) charset=utf8 ENGINE=InnoDB;

insert into users(username,password)values('zhangsan','123');

drop table if EXISTS user_roles;
create table user_roles(
                           id bigint auto_increment,
                           username varchar(100),
                           role_name varchar(100),
                           constraint pk_user_roles primary key(id)
) charset=utf8 ENGINE=InnoDB;

INSERT INTO user_roles VALUES(1,'zhangsan','admin');


drop table if EXISTS roles_permissions;

create table roles_permissions(
                                  id bigint auto_increment,
                                  role_name varchar(100),
                                  permission varchar(100),
                                  constraint pk_roles_permissions primary key(id)
) charset=utf8 ENGINE=InnoDB;


INSERT INTO roles_permissions VALUES(1,'admin','update');
//设置数据库链接
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/shiro");
dataSource.setUser("root");
dataSource.setPassword("root");

//创建DefaultSecurityManager
DefaultSecurityManager securityManager = new DefaultSecurityManager();
SecurityUtils.setSecurityManager(securityManager);
//创建JdbcRealm
JdbcRealm jdbcRealm = new JdbcRealm();
jdbcRealm.setDataSource(dataSource);
securityManager.setRealm(jdbcRealm);
//认证的过程中,查看是否有相应的权限
jdbcRealm.setPermissionsLookupEnabled(true);
// get the currently executing user:
Subject subject = SecurityUtils.getSubject();

UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123");

subject.login(token);
//不跑出异常说明登录成功
System.out.println("登录成功");

subject.login(token);
System.out.println();
//不跑出异常说明登录成功
System.out.println("登录成功");
//判断是否有相应角色
boolean admin = subject.hasRole("admin");
System.out.println(admin);

boolean update = subject.isPermitted("update");
System.out.println(update);

认证过程中主要调用

doGetAuthenticationInfo(AuthenticationToken token):用于验证用户的身份的主体,主要为账号和密码
doGetAuthorizationInfo(PrincipalCollection principals):主要验证用户的角色与权限

示例代码

原文地址:https://www.cnblogs.com/haizhilangzi/p/15016633.html