spring整合shiro认证和授权
2017-08-03 12:03
555 查看
第一步:引入shiro框架相关的jar
第二步:在web.xml中配置spring框架提供的用于整合shiro框架的过滤器,该过滤器必须放到struts核心过滤器之前
第三步:在spring配置文件中配置bean,id为shiroFilter(名字与web.xml中配置的过滤器名字相同)
第四步:配置安全管理器
第五步:添加登录认证的逻辑
第六步:自定义realm,并注入给安全管理器
通过用户表查询出用户权限的service方法
public List<Function> findAllByUser(User user) {
String hql = "SELECT DISTINCT f FROM Function f LEFT OUTER JOIN f.roles r LEFT OUTER JOIN r.users";
List<Function> listFunction = (List<Function>) this.getHibernateTemplate().find(hql);
return listFunction;
}
注意:认证方法和授权方法执行的条件都是在spring配置文件中配置的url的访问路径的权限。
以上即是使用shiro进行认证和授权的过程。
shiro框架认证流程:
框架提供的过滤器:
<!-- 引入shiro框架的依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.2.2</version> </dependency>
第二步:在web.xml中配置spring框架提供的用于整合shiro框架的过滤器,该过滤器必须放到struts核心过滤器之前
<!-- 配置spring整合shiro的过滤器,此过滤器必须放到struts2过滤器之前 --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
第三步:在spring配置文件中配置bean,id为shiroFilter(名字与web.xml中配置的过滤器名字相同)
<!-- 配置shiro框架的过滤器工厂对象 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- 注入安全管理器对象 --> <property name="securityManager" ref="securityManager"></property> <!-- 注入相关页面url --> <property name="loginUrl" value="/login.jsp"></property> <property name="successUrl" value="/index.jsp"></property> <property name="unauthorizedUrl" value="/unauthorized.jsp"></property> <!-- 注册url拦截规则 --> <property name="filterChainDefinitions"> <value> /css/** = anon <!-- 匿名方式 统一放行 --> /js/** = anon /images/** = anon /validatecode.jsp* = anon /login.jsp = anon /userAction_login.action = anon /page_base_staff.action = perms["staff-list"] <!-- 进行权限校验 --> /* = authc <!-- 查看当前用户是否认证,没有则返回登录页面 --> </value> </property> </bean>
第四步:配置安全管理器
<!-- 配置shiro框架的安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- 在安全管理器中注入realm --> <property name="realm" ref="bosRealm"></property> </bean>
第五步:添加登录认证的逻辑
//使用shiro框架进行认证 Subject subject = SecurityUtils.getSubject(); //获取当前用户对象,状态为“未认证” //获取认证的用户名密码令牌 AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),MD5Utils.md5(model.getPassword())); //进行认证,调用安全管理器 try { subject.login(token); } catch (AuthenticationException e) { //认证失败,抛出异常,回到登录页面 this.addActionError("用户名或密码错误"); return LOGIN; } //为了防止拦截器因为没有session的问题拦截页面,需要从subject中获取在realm中传入的user,放到session中 User user = (User) subject.getPrincipal(); ServletActionContext.getRequest().getSession().setAttribute("loginUser", user); return HOME;
第六步:自定义realm,并注入给安全管理器
public class BOSRealm extends AuthorizingRealm { @Autowired private IUserDao userDao; /** * 授权 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection paramPrincipalCollection) { //为用户授权 //为用户授权 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //根据当前用户查询数据库,获取实际对应的权限 //获取当前用户 User user = (User) SecurityUtils.getSubject().getPrincipal(); List<Function> listFunction = null; //如果是admin,就将所有权限都赋上 if ("admin".equals(user.getUsername())) { listFunction = functionDao.findAll(); } else { //通过用户的角色查询所有权限(使用左外连接效率更高一些) listFunction = functionDao.findAllByUser(user); } //循环为当前用户添加权限 for (Function function : listFunction) { info.addStringPermission(function.getCode()); } return info; } /** * 认证 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken paramAuthenticationToken) throws AuthenticationException { //为了获取参数中的用户名和密码,需要将AuthenticationToken向下转型成UsernamePasswordToken UsernamePasswordToken token = (UsernamePasswordToken)paramAuthenticationToken; //从令牌中获取用户名 String username = token.getUsername(); //利用username查询user对象 User user = userDao.findUserByUsername(username); if (user == null) { //如果查不出这个user对象,说明用户名错误,返回null后shiro的安全管理器会报异常 return null; } //简单认真对象 AuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),this.getName()); //框架shiro负责比对密码是否一致 return info; }
通过用户表查询出用户权限的service方法
public List<Function> findAllByUser(User user) {
String hql = "SELECT DISTINCT f FROM Function f LEFT OUTER JOIN f.roles r LEFT OUTER JOIN r.users";
List<Function> listFunction = (List<Function>) this.getHibernateTemplate().find(hql);
return listFunction;
}
注意:认证方法和授权方法执行的条件都是在spring配置文件中配置的url的访问路径的权限。
<!-- 配置shiro框架的realm --> <bean id="bosRealm" class="com.itheima.bos.realm.BOSRealm"></bean>
以上即是使用shiro进行认证和授权的过程。
shiro框架认证流程:
框架提供的过滤器:
相关文章推荐
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- 008-shiro与spring web项目整合【二】认证、授权、session管理
- apache shiro与spring整合、动态filterChainDefinitions、以及认证、授权
- springmvc+shiro+maven 实现登录认证与权限授权管理
- SpringBoot+shiro整合学习之登录认证和权限控制
- springboot整合shiro-登录认证和权限管理
- springboot整合shiro-登录认证和权限管理
- 转载:Spring Boot (十四):springboot整合shiro-登录认证和权限管理
- Shiro第四篇【Shiro与Spring整合、快速入门、Shiro过滤器、登陆认证】
- SpringBoot整合Shiro实现登录认证的方法
- springboot(十四):springboot整合shiro-登录认证和权限管理
- SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存
- springmvc+shiro+maven 实现登录认证与权限授权管理
- SpringBoot+shiro整合学习之登录认证和权限控制