shiro中的realm
时间: 2024-08-01 10:01:10 浏览: 54
在Shiro(Apache Shiro,一个开源的身份管理和权限管理框架)中,Realm是一个核心组件,它是访问控制策略的核心部分,负责实际的认证(Authentication)和授权(Authorization)。每个Realm都是一个实现了特定接口如`org.apache.shiro.authc.AuthenticationInfoProvider`或`org.apache.shiro.authorization.AuthorizationInfoProvider`的对象。
当用户尝试访问受保护的资源时,Shiro会首先通过SecurityManager找到配置的Realm并请求身份验证信息。Realm通常从数据源如数据库、文件、甚至是自定义的逻辑中获取用户的凭据(如用户名和密码),然后进行验证。如果验证成功,它将返回包含用户标识和角色等信息的`AuthenticationInfo`对象。
对于授权,Realm同样提供了一个授权决策过程,生成`AuthorizationInfo`,包括用户所拥有的权限列表。这些权限信息会被用来确定用户是否有权访问特定的资源或执行某项操作。
Shiro支持多种类型的Realm,例如BasicAuthorizingRealm、DatabaseRealm、HashingLoginModule Realm等,可以根据应用的具体需求选择合适的 Realm 实现。
相关问题
shiro多realm多登录界面
Shiro支持多个Realm,你可以在shiro.ini或者shiro-config.xml中配置多个Realm。每个Realm可以用于不同类型的认证,比如一个Realm可以用于数据库认证,另一个Realm可以用于LDAP认证等等。
至于多个登录界面的实现,可以通过在不同的URL上部署不同的登录页面来实现。你可以在Shiro的FilterChain中定义多个过滤器链,每个过滤器链可以用于不同的URL,并在其中指定对应的登录页面。比如:
```ini
[main]
...
authc1 = org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authc1.loginUrl = /login1.jsp
authc2 = org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authc2.loginUrl = /login2.jsp
[urls]
/login1 = authc1
/login2 = authc2
```
这样,当用户访问/login1时,会跳转到/login1.jsp页面进行认证;当用户访问/login2时,会跳转到/login2.jsp页面进行认证。你也可以根据自己的实际需要进行修改和扩展。
生成一个shiro自定义Realm的代码
以下是一个简单的Shiro自定义Realm代码示例:
```
import org.apache.shiro.authc.*;
import org.apache.shiro.realm.*;
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 这里实现权限和角色信息的获取和设置,可以从数据库或其他数据源获取
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.addRole("admin");
authorizationInfo.addStringPermission("user:create");
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 这里实现用户认证,可以从数据库或其他数据源获取用户信息进行验证
String username = (String) token.getPrincipal();
String password = new String((char[]) token.getCredentials());
if (!"admin".equals(username)) {
throw new UnknownAccountException();
}
if (!"password".equals(password)) {
throw new IncorrectCredentialsException();
}
return new SimpleAuthenticationInfo(username, password, getName());
}
}
```
该自定义Realm实现了Shiro的`AuthorizingRealm`接口,实现了权限和角色信息的获取和设置,以及用户认证的方法。其中,`doGetAuthorizationInfo`方法用于获取用户的角色和权限信息,并将其封装到`AuthorizationInfo`对象中返回;`doGetAuthenticationInfo`方法用于验证用户的身份和凭证信息,并将其封装到`AuthenticationInfo`对象中返回。在这个简单的示例中,认证信息被硬编码为了"admin"和"password",实际使用时应该从数据库或其他数据源中获取。
阅读全文