zoukankan      html  css  js  c++  java
  • BOS项目 第7天(shiro权限框架进行认证和授权)

    BOS项目笔记 第7

     

    今天内容安排:

    1、权限概述(认证、授权)

    2、常见的权限控制的方式(URL拦截权限控制、方法注解权限控制)

    3、权限数据模型(权限表、角色表、用户表、角色权限关系表、用户角色关系表)

    4shiro框架入门

    5、将shiro应用到bos项目中进行认证和授权

     

    1. 权限概述

    系统提供了很多功能,并不是所有的用户登录系统都可以操作这些功能。我们需要对用户的访问进行控制。

    认证:系统提供的用于识别用户身份的功能(通常是登录功能)-----让系统知道你是谁??

    授权:系统提供的赋予用户访问某个功能的能力-----让系统知道你能做什么??

     

    2. 常见的权限控制的方式

    2.1 URL拦截权限控制---基于过滤器或者拦截器

     

    2.2 方法注解权限控制---基于代理技术

     

    3. 权限模块数据模型

    用户表:t_user

    角色表:auth_role

    权限表:auth_function

    用户角色关系表:user_role

    角色权限关系表:role_function

     

     

    4. apache shiro

    官网:http://shiro.apache.org/

    Apache Shiro is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.

    提供的功能:

     

     

    l shiro的程序运行流程图:

     

    Application code:应用程序代码,开发人员编写的代码

    Subject:主体,当前用户

    SecurityManager:安全管理器,shiro框架的核心对象,管理各个组件

    Realm:类似于Dao,负责访问安全数据(用户数据、角色数据、权限数据)

     

     

     

    5. shiro应用到bos项目

    第一步:导入shiro-all.jar

    第二步:在web.xml中配置一个spring用于整合shiro的过滤器

     

    第三步:在spring配置文件中配置一个beanid必须和上面的过滤器名称相同

    <!-- 配置一个工厂bean,用于创建shiro框架用到过滤器 -->

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

    <!-- 注入安全管理器 -->

    <property name="securityManager" ref="securityManager"></property>

    <!-- 注入当前系统的登录页面 -->

    <property name="loginUrl" value="/login.jsp"/>

    <!-- 注入成功页面 -->

    <property name="successUrl" value="/index.jsp"/>

    <!-- 注入权限不足提示页面 -->

    <property name="unauthorizedUrl" value="/unauthorizedUrl.jsp"/>

    <!-- 注入URL拦截规则 -->

    <property name="filterChainDefinitions">

    <value>

    /css/** = anon

    /images/** = anon

    /js/** = anon

    /login.jsp* = anon

    /validatecode.jsp* = anon

    /userAction_login.action = anon

    /page_base_staff.action = perms["staff"]

    /* = authc

    </value>

    </property>

    </bean>

    第四步:在spring配置文件中注册安全管理器,为安全管理器注入realm

    <!-- 注册自定义realm -->

    <bean id="bosRealm" class="com.itheima.bos.shiro.BOSRealm"></bean>

     

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

    <!-- 注入上面的realm -->

    <property name="realm" ref="bosRealm"/>

    </bean>

    第五步:自定义一个BOSRealm

    public class BOSRealm extends AuthorizingRealm {

    @Resource

    private IUserDao userDao;

    /**

     * 认证方法

     */

    protected AuthenticationInfo doGetAuthenticationInfo(

    AuthenticationToken token) throws AuthenticationException {

    System.out.println("认证方法。。。");

    UsernamePasswordToken upToken = (UsernamePasswordToken) token;

    String username = upToken.getUsername();// 从令牌中获得用户名

     

    User user = userDao.findUserByUsername(username);

    if (user == null) {

    // 用户名不存在

    return null;

    } else {

    // 用户名存在

    String password = user.getPassword();// 获得数据库中存储的密码

    // 创建简单认证信息对象

    /***

     * 参数一:签名,程序可以在任意位置获取当前放入的对象

     * 参数二:从数据库中查询出的密码

     * 参数三:当前realm的名称

     */

    SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,

    password, this.getClass().getSimpleName());

    return info;//返回给安全管理器,由安全管理器负责比对数据库中查询出的密码和页面提交的密码

    }

    }

    /**

     * 授权方法

     */

    protected AuthorizationInfo doGetAuthorizationInfo(

    PrincipalCollection principals) {

    return null;

    }

    }

    第六步完善UserActionlogin方法

    public String login(){

    //生成的验证码

    String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");

    //判断用户输入的验证码是否正确

    if(StringUtils.isNotBlank(checkcode) && checkcode.equals(key)){

    //验证码正确

    //获得当前用户对象

    Subject subject = SecurityUtils.getSubject();//状态为未认证

    String password = model.getPassword();

    password = MD5Utils.md5(password);

    //构造一个用户名密码令牌

    AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), password);

    try{

    subject.login(token);

    }catch (UnknownAccountException e) {

    e.printStackTrace();

    //设置错误信息

    this.addActionError(this.getText("usernamenotfound"));

    return "login";

    }catch (Exception e) {

    e.printStackTrace();

    //设置错误信息

    this.addActionError(this.getText("loginError"));

    return "login";

    }

    //获取认证信息对象中存储的User对象

    User user = (User) subject.getPrincipal();

    ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);

    return "home";

    }else{

    //验证码错误,设置错误提示信息,跳转到登录页面

    this.addActionError(this.getText("validateCodeError"));

    return "login";

    }

    }

     

    第七步:在自定义Realm中编写授权方法

     

     

    6. shiro提供的权限控制方式

    6.1 URL拦截权限控制

     

    6.2 方法注解权限控制

    第一步:在spring配置文件中开启shiro的注解支持

     

    第二步:在Action的方法上使用shiro的注解描述执行当前方法需要具有的权限

     

    第三步修改BaseAction的构造方法

     

    第四步:在struts.xml中配置全局异常捕获,统一跳转到权限不足的页面

     

    6.3 页面标签权限控制

    第一步:在jsp页面中引入shiro的标签

     

    第二步:使用shiro的标签根据当前用户拥有的权限动态展示页面元素

     

    6.4 代码级别权限(了解)

     

  • 相关阅读:
    删除指定字符
    Palindromes&nbsp;_easy&nbsp;version
    统计元音
    查找最大元素
    首字母变大写
    Intent加强
    GUI_键盘事件
    GUI_鼠标事件
    GUI_事件监听机制与ActionListener演示
    GUI概述与Frame演示
  • 原文地址:https://www.cnblogs.com/wujizun/p/6931141.html
Copyright © 2011-2022 走看看