概述
认证,权限验证、域是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参数来对比