什么是shiro shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证、权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
Shiro我的理解: Shiro就是自定义注解权限注解,与自定义jsp标签,与java web的filter实现的权限控件。 2 shiro能做什么? (1)验证用户。 (2)对用户执行访问控制,如: 判断用户是否拥有角色admin,判断用户是否拥有访问的权限。 (3)在任何环境下使用Session API。例如CS程序。 (4)可以使用多个用户数据源。例如一个是oracle用户库,另外一个是mysql用户库。 (5)单点登录(SSO)功能。 (6)"Remember Me"服务,类似购物车的功能,shiro官方建议开启
3 shiro的组成 认证Authenticator, 授权Authorizer session管理SessionManager CacheManager即缓存管理 Cryptography即密码管理
3 shiro的认证过程 1 客户发送请求,shiro的filter拦截请求, 2 shiro调用自定realm中认证方法进行认证 3 shiro自定义realm的认证方法根据用户名,获取权限,判断是否有权限 4 如果有权限,请求向下运行 如果没有权限shiro就行跳转到错误页面(错误页面在shirofilter进行配置)
3 shiro的授权与认证过程相似
1.使用URL实现权限控制 spring配置shirofiter配置url验证规则 2.使用注解实现权限控制 @RequiresPermissions({“ceshi.test”}) @RequiresRoles(“adminRole”)
3.使用shiro标签进行权限控制
7 项目应用 步骤2:pom文件中引入shiro的依赖,引入shiro-all依赖包 步骤3:在web.xml配置shiro的过滤器,配置过滤请求的地址 步骤4:创建spring于shiro整合的配置文件,spring-context-shiro.xml, 4.1 在spring-context-shiro.xml中配置shiroFilter,配置登陆页面、系统成功页面、权限不足提示页面、配置url地址拦截规则(anon,不需要认证,authc配置需要认证) 4.2 配置securityManager,在安全管理器中配置自定义realm,配置ehcahce缓存
<!--注册安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="userRealm" /> <!-- 配置缓存 --> <property name="cacheManager" ref="cacheManager"/> </bean> <!-- 配置缓存 --> <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager" />步骤5:使用注解实现权限控制 5.1:(1)在Springmvc配置文件中开启shiro注解
<aop:config proxy-target-class="true"></aop:config> <!-- 开启shiro注解支持 --> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
5.2:(2)在要设置权限的方法上使用shiro注解
@RequiresPermissions({"ceshi.test"}) @RequiresRoles("adminRole") @RequestMapping("test.do") public String test(){ return "test"; }5.3 配置spingmvc的统一异常处理
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="org.apache.shiro.authz.UnauthorizedException">/refuse</prop> <prop key="java.lang.Throwable">error/500</prop> </props> </property> </bean>步骤六:修改登录方法,构建用户密码令牌,使用shiro完成认证,如果错误抛出异常 6.1 @RequestMapping(value="/login.do" ,method=RequestMethod.POST) @ResponseBody public AjaxJson doLogin(User user,HttpSession session){ boolean flag = false; String msg = “用户名密码错误”; try { //获取当前用户,状态为未认证 Subject subject = SecurityUtils.getSubject(); //构建一个用户密码令牌 UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword()); //shiro认证 subject.login(token); session.setAttribute(Constants.SESSION_USER, user); flag = true;//登陆成功 } catch (Exception e) { e.printStackTrace(); } return new AjaxJson(flag ,msg); } 6.2 创建自定义realm,继承AuthorizingRealm ,注入用户service以及权限service,实现授权与认证方法
public class UserRealm extends AuthorizingRealm { @Autowired private UserService userService; /** * 认证,你是谁 */ protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException {
} //用于授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { }}
步骤7:创建一张表,t_sys_role_perm或在角色表中添加一个权限字段,类型为text 7.1 角色表中添加一个权限字段,类型为text 7.2 修改角色实体类 7.3 修改角色的mapper.xml 步骤9 修改资源ztree的回写
步骤10;在controller添加shirod额权限注解 @RequiresPermissions({“admin:role:list”}) @RequestMapping("/v_list.do") public String list() throws Exception{ return “/plateform/role/role_list”; }