Shiro中认证、授权、域相关知识

概述

认证,权限验证、域是Shiro的主要功能

认证、权限验证、用户验证

概述:用于验证用户是否账号/凭证和权限的功能

认证方法:

login(AuthenticationToken token)

权限验证方法:
  • checkPermission(String permission)
  • checkPermissions(Collection permissions)
  • checkPermissions(String… permissions)
用户验证方法:
  • checkRole(String roleIdentifier)
  • checkRoles(Collection roleIdentifiers)
  • checkRoles(String… roleIdentifiers)

域(Realm)

概述:Shiro在验证时它会从设置的Realm中去拿数据进行验证,也就是说Realm相当于保存验证所需的数据的池

IniRealm

概述:使用ini配置文件来作为数验证的池

案例:

DefaultSecurityManager manager = new DefaultSecurityManager();
IniRealm realm = new IniRealm();
manager.setRealm(realm);
SecurityUtils. setSecurityManager(manager)
Subject user = SecurityUtils.getSubject();
user.login(new UsernamePasswordToken(“账号”,”密码”))
// 其他验证等等
user.logout(); // 登出

配置文件格式:

[users]
admin=123,admin
# 格式: 用户名=凭证,角色1,角色2...   可有一个或多个用户

[roles]
admin=user:delete,select
# 格式: 角色=权限1,权限2....   可有一个或多个角色
PropertiesRealm

概述:使用properties配置文件来作为验证的池

案例:

DefaultSecurityManager manager = new DefaultSecurityManager();
PropertiesRealm realm = new PropertiesRealm();
manager.setRealm(realm);
SecurityUtils. setSecurityManager(manager)
Subject user = SecurityUtils.getSubject();
user.login(new UsernamePasswordToken(“账号”,”密码”))
//  其他验证等等
user.logout()  // 登出

配置文件格式:

user.username=password,role1,role2...
role.rolename=permissionDefinition1, permissionDefinition2,...
JdbcRealm

概述:使用数据库来作为验证的池

案例:

DefaultSecurityManager manager = new DefaultSecurityManager();
JdbcRealm realm = new JdbcRealm();
realm.setAuthenticationQuery(“select password form users where name = ?);
realm.setPermissionsQuery(“select permission_name from permission_authentication where athentication_name = ?);
realm.setUserRolesQuery(“select role_name from role_user where user_name=?);
realm.setDataSource(dataSource);
manager.setRealm(realm);
SecurityUtils. setSecurityManager(manager)
Subject user = SecurityUtils.getSubject();
user.login(new UsernamePasswordToken(“账号”,”密码”))
// 其他验证等等
// 如果需要验证权限需要设置该项为true realm.setPermissionsLookupEnabled(true)
user.logout()  // 登出

注意:使用JdbcRealm时要设置指定的数据源,通常是数据库然后设置查询用户验证,用户角色,用户权限的sql,sql的格式必须只返回一列,且“?”将要留下将会把用户名作为参数传入查询

自定义Realm

概述:我们自定义一个域来作为验证的池,这个类可以实现Realm接口,但我们通常继承AuthorizingRealm类

案例:

@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username=(String) token.getPrincipal();  //得到用户名
String password = getPasswordByName(username);  //通过用户名得到密码
if(password==null) return null;  //没有这个用户返回null
retrun new SimpleAuthenticationInfo(username,password,”customRealm”);  //有的话返回包含用户信息的token
}

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection token) {
String name = (String) token.getPrimaryPrincipal();  //得到用户名
Set<String> roles = getRolesByName(name);  //通过用户名得到该用户的角色
set<String> permissions = getPermissionsByName(name);  //通过用户名得到该用户权限
SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();  //创建权限认证对象
authorizationInfo.setRoles(roles);  //设置认证角色
authorizationInfo.setStringPermissions(permissions);  //设置认证权限
return authorizationInfo;  //返回出去
}
doGetAuthorizationInfo方法

概述:该方法是SubjectManager将调用的授权方法,该方法返回的对象所拥有的权限和角色就是所授予调用角色/权限检查的用户的权限与角色

doGetAuthenticationInfo方法

概述:该方法是SubjectManager将调用的认证方法,该方法返回一个认证对象,认证对象的账号凭证都要是正确的,如果没有这个账号呢么则返回空,Shiro会根据返回对象和login参数来对比

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值