Apache Shiro的简单使用

Apache Shiro的简单了解

  1. 在java中进行权限控制功能,主要分为粗粒度(基于URL级别权限控制)和细粒度(基于方法级别权限控制)两种。主要使用的框架一般有Spring Security与Apache Shiro,前者使用比较复杂,依赖spring,后者使用更轻量,使用更简单,不完全依赖spring,可以独立使用
  2. 粗粒度权限控制(基于URL级别权限控制)
    1. 粗粒度权限控制一般主要是基于Fileter过滤器来进行实现
    2. 一般需要最少五张表,即用户表(User)、权限表(Permission)、角色表(Role)、还有用户与角色关联表,角色与权限关联表。
    3. 如果需要还需要添加Menu表,添加菜单,方便动态的为不同的用户显示不同的菜单管理,如果配置Menu表,则还需要配置角色与菜单关联表
  3. 使用Apache Shiro进行权限控制
    1. Apache Shiro体系结构有6部分
      • Authentication 认证—用户登录
      • Authorization 授权—用户具有哪些权限
      • Cryptography 安全数据加密
      • Session Management 会话管理
      • Web Integration web系统集成
      • Integrations 集成其他应用,spring、缓存框架
    2. 使用maven进行管理,导入相应的依赖jar包
<dependency>
    <groupId>org.apache.shirogroupId>                                     
    <artifactId>shiro-allartifactId>
    <version>1.3.2version>
dependency>
  1. 使用Shiro进行权限控制有四种主要方式
    • 在程序中通过Subject编程方式进行权限控制
    • 配置Filter实现URL级别粗粒度权限控制
    • 配置代理,基于注解实现细粒度权限控制
    • 在页面中使用shiro自定义标签实现页面显示权限控制

用户登录功能使用Apache Shiro来进行实现(使用URL粗粒度级别)

第一步 : 配置web.xml

 
<filter>
     <filter-name>shiroFilterfilter-name>
     <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
filter>
<filter-mapping>
     <filter-name>shiroFilterfilter-name>
     <url-pattern>/*url-pattern>
filter-mapping>

第二步:配置applicationContext.xml,引入相关的名称空间


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

第三步:配置相关的bean

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">    
     
     <property name="securityManager" ref="securityManager">property>
     
     <property name="loginUrl" value="/login.html">property>
     
     <property name="successUrl" value="/index.html">property>
     
     <property name="unauthorizedUrl" value="/unauthorized.html">property>
     
     <property name="filterChainDefinitions">
          <value>
               /login.html* = anon       
               /css/** = anon
               /js/** = anon
               /images/** = anon
               /validatecode.jsp = anon     
               /user_login.action* = anon     
               /** = authc
          value>
     property>
bean>

第四步:使用struts2接收前台传递的数据

@Controller
@ParentPackage("json-default")
@Namespace("/")
@Scope("prototype")
public class UserAction extends BaseAction<User> {

     //这里的用户账户名和密码信息存放在User实体类和表中,采用模型驱动来封装并接收参数

     private static final long serialVersionUID = -6905277651888140750L;

     @Action(value = "user_login", results = { @Result(name = "success", type = "redirect", location = "./index.html"),
          @Result(name = "login", type = "redirect", location = "./login.html")})
     //用户登录的方法实现
     public String login() {
          //基于shiro实现登录功能,获得subject
          Subject subject = SecurityUtils.getSubject();
          //获取用户输入的用户名和密码信息
          AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),model.getPassword());

          try {
               subject.login(token);
               //登录成功
               return SUCCESS;
          } catch (AuthenticationException e) {
               e.printStackTrace();
               //登录失败,跳转到登录页面
               return LOGIN;
          }
     }
}

第五步:创建一个Realm对象,用于实现真正的登录认证(开发中一般直接继承AuthorizingRealm)

@Service("bosRealm")
public class BosRealm extends AuthorizingRealm {

     @Autowired
     private UserService userService;

     @Override
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

          System.out.println("shiro 认证管理......");

          UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
          //根据用户名查询用户的信息
          User user = userService.findByUsername(usernamePasswordToken.getUsername());

          if (user == null) {
               //如果用户不存在,则登录失败
               return null;
          } else {
               //如果用户名存在
               //返回用户名密码,securityManager安全管理器会自动将返回密码与用户输入密码进行匹配,若一致登录成功,不一致则报异常
               return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
          }
     }
}

第六步:写service层与dao层,配置安全管理器


  <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
       <property name="realm" ref="bosRealm">property>     
  bean>

  <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor">bean>

至此,用户登录权限拦截就简单实现了,当用户不存在时,会报org.apache.shiro.authc.UnknownAccountException异常,如果用户名密码错误,则会报org.apache.shiro.authc.IncorrectCredentialsException异常

你可能感兴趣的:(Apache Shiro的简单使用)