本文将详细讲解如何使用Shiro进行拦截认证的全过程。针对Shiro拦截认证的过程,主要是包括Shiro拦截器、Shiro过滤器和Shiro Realm三个部分。我们将逐步介绍这三个部分的功能和作用,并且提供两个示例,更好地帮助您理解Shiro的使用。
Shiro拦截器
Shiro拦截器的主要作用是在请求到达目标方法之前,拦截该请求,进行用户身份认证、权限控制等操作。Shiro提供了一系列预定义的拦截器,也可以根据需要自定义拦截器。在Shiro中,拦截器是通过FilterChain进行管理的。
示例一:自定义拦截器
public class CustomAuthInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//通过request、response对象判断用户身份
if (request.getUserPrincipal() == null) {
//进行身份验证失败处理
response.sendRedirect("/login");
return false;//不再继续执行目标方法
}
return true;//继续执行目标方法
}
}
通过继承HandlerInterceptorAdapter抽象类,我们可以自定义拦截器,并且在preHandle方法中实现对用户身份的认证,如果认证失败则重定向到/login页面。
Shiro过滤器
过滤器是Shiro中拦截器的具体实现,通过对URL、IP地址、用户名等进行过滤,保护应用程序的安全。Shiro提供了一系列预定义的过滤器,也可以根据需要自定义过滤器。在Shiro中,过滤器是通过FilterChainDefinitionMap进行管理的。
示例二:使用Shiro自带过滤器
在Shiro中,有各种各样的过滤器,可以完成不同的任务,如登陆认证、授权、记住我等。下面是一个简单的FilterChainDefinitionMap配置:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
...
<property name="filterChainDefinitionMap">
<map>
<entry key="/admin/**" value="authc,roles[admin]"/>
<entry key="/user/**" value="authc,roles[user]"/>
<entry key="/login" value="authc"/>
<entry key="/logout" value="logout"/>
</map>
</property>
</bean>
上面示例中,我们对URL进行了分类,设置了不同的访问规则,如访问/admin/下的页面必须是已经通过admin身份认证的用户才能访问。
Shiro Realm
Shiro Realm是负责对用户身份信息进行管理和认证的组件,它从数据源中获取用户信息,并且提供身份认证、授权、加密等功能。在Shiro中,Realm是一个接口,需要进行自定义。
示例三:自定义Realm
public class MyRealm extends AuthorizingRealm {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//获取当前用户信息,如用户角色、权限等
String username = (String) principals.fromRealm(getName()).iterator().next();
User user = userService.getUserByName(username);
SimpleAuthorizationInfo authInfo = new SimpleAuthorizationInfo();
for (Role role : user.getRoles()) {
authInfo.addRole(role.getName());
for (Permission perm : role.getPermissions()) {
authInfo.addStringPermission(perm.getName());
}
}
return authInfo;
}
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
User user = userService.getUserByName(userToken.getUsername());
if(user == null) {
throw new UnknownAccountException("无此用户");
}
return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
}
}
通过实现AuthorizingRealm抽象类,我们可以自定义Realm,并且在doGetAuthorizationInfo方法中获取当前用户的角色和权限信息,在doGetAuthenticationInfo方法中对用户身份信息进行认证。
上述内容就是Shiro拦截认证的全过程记录的完整攻略了,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:shiro拦截认证的全过程记录 - Python技术站