shiro:
shiro是一个权限管理框架,是apache下的开源项目。相比spring security框架更简单灵活,spring security对spring依赖较强。shiro可以实现web系统、c/s、分布式等系统 权限管理。
认证流程*
1、subject(主体)请求认证,调用subject.login(token)
2、SecurityManager (安全管理器)执行认证
3、SecurityManager通过ModularRealmAuthenticator进行认证。
4、ModularRealmAuthenticator将token传给realm,realm根据token中用户信息从数据库查询用户信息(包括身份和凭证)
5、realm如果查询不到用户给ModularRealmAuthenticator返回null,ModularRealmAuthenticator抛出异常(用户不存在)
6、realm如果查询到用户给ModularRealmAuthenticator返回AuthenticationInfo(认证信息)
7、ModularRealmAuthenticator拿着AuthenticationInfo(认证信息)去进行凭证(密码 )比对。如果一致则认证通过,如果不致抛出异常(凭证错误)。
------------------------------------
授权流程*
Shiro 支持三种方式的授权:
编程式:通过写if/else 授权代码块完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
注解式:通过在执行的Java方法上放置相应的注解完成:
@RequiresRoles(“admin”)
public void hello() {
//有权限
}
JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
<shiro:hasRole name=“admin”>
<!— 有权限—>
</shiro:hasRole>
——————————————————————————
另附shiro的配置类
package com.liam.shiro;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.apache.shiro.mgt.SecurityManager;
import java.util.LinkedHashMap;
import java.util.Map;
@Configuration
public class ShiroCofig {
/**
* shiro 的过滤器链
* shiro的核心总入口
*
* */
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
System.out.println("ShiroConfiguration.shirFilter()");
// shiro过滤器工厂
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 必须设置 SecurityManager 如果不设置就无法完成认证和授权
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 过滤器链
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
// 配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
// logout shiro定义好的过滤器名字 /logout访问路径
// 浏览器访问的地址栏路径中以/logout结尾的路径 走logout过滤器
// logout会清除session 退出登录
//第一个参数是前台发送的路径
filterChainDefinitionMap.put("/logout", "logout");
// 所有的css文件走 anon过滤器 此过滤器代表放过拦截 不需要权限也能访问
filterChainDefinitionMap.put("/css/**", "anon");
// 放过登录页面拦截
filterChainDefinitionMap.put("/toLogin", "anon");
filterChainDefinitionMap.put("/img/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
/// **代表所有路径 除以上路径外都拦截 authc代表权限拦截过滤器
filterChainDefinitionMap.put("/**", "authc");
// perms权限过滤器 必须拥有某项权限才能访问对应路径
// filterChainDefinitionMap.put("/add", "perms[user:query]");
// 登录请求路径 登录页面提交form表单时 表单的action写此路径
shiroFilterFactoryBean.setLoginUrl("/login");
// 登录成功跳转到登录成功页面
shiroFilterFactoryBean.setSuccessUrl("/index");
// 未授权界面;
//shiroFilterFactoryBean.setUnauthorizedUrl("/warning");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
// 最终返回过滤器链
return shiroFilterFactoryBean;
}
@Bean // 在xml文件中配置一个bean标签 相当于<bean class="
// org.apache.shiro.mgt.SecurityManager"
// name="securityManager"></bean>
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置realm. 域(数据源 用来连接数据库完成认证和授权)
// 把自己创建的Realm 注入到securityManager中
securityManager.setRealm(myShiroRealm());
// 注入缓存管理器;
//securityManager.setCacheManager(ehCacheManager());//
// 这个如果执行多次,也是同样的一个对象;
// securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
@Bean
public MyRealm myShiroRealm(){
return new MyRealm();
}
}