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
    评论
Shiro框架是一个功能强大的Java安全框架,可以用于认证授权。下面是使用Shiro进行认证授权的基本步骤: 1. 添加Shiro依赖:在你的项目添加Shiro相关依赖,可以通过Maven或者Gradle进行引入。 2. 配置Shiro:创建一个Shiro的配置文件(通常是一个ini文件),配置Shiro的一些基本信息,例如Realm、Session管理等。你可以根据你的需求进行配置。 3. 创建Realm:Realm是Shiro用来进行认证授权的核心组件。你需要实现一个自定义的Realm来实现用户的认证授权逻辑。在Realm,你可以通过重写相应的方法来实现自定义的认证授权逻辑,例如验证用户名密码、查询用户角色和权限等。 4. 认证:在用户登录时,你可以通过调用Shiro提供的Subject.login方法来进行认证。该方法会将用户提交的用户名和密码传递给你自定义的Realm进行验证。如果验证通过,Shiro会将用户信息保存在Session。 5. 授权:在用户进行操作时,你可以通过调用Shiro提供的Subject.hasRole和Subject.isPermitted方法来进行授权判断。这些方法会根据你在Realm配置的角色和权限信息进行判断,决定用户是否具有相应的角色或权限。 以上是使用Shiro进行认证授权的基本步骤,你可以根据具体的需求进行定制和扩展。在实际应用,你还可以通过Shiro提供的其他功能,如RememberMe、Session管理等来增强安全性和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值