08 SSM整合案例(企業權限管理系統):10.權限關聯與控制

04.AdminLTE的基本介紹html

05.SSM整合案例的基本介紹java

06.產品操做web

07.訂單操做spring

08.權限控制express

09.用戶操做api

10.權限關聯與控制網絡

11.AOP日誌mybatis

10.權限關聯與控制


 

 1.用戶關聯角色操做-流程分析oracle

 1.用戶關聯角色操做-流程分析

項目運行的網絡環境發生變化後,實際上就是我筆記本電腦 所鏈接到的路由器發生變動。須要用cmd下的ipconfig命令查看當前主機IP地址,而後去web子模塊項目的resources目錄下把jdbc.properties配置文件的app

jdbc.url=jdbc:oracle:thin:@192.168.0.108:1521:orcl     作修改後從新install一下WEB項目再測試就跑通了。

  2.用戶關聯角色操做 

  視圖層的UsersControler  

    //查詢用戶以及能夠添加的角色
    @RequestMapping("/findUserByIdAndAllRole.do")
    public ModelAndView findUserByIdAndAllRole(@RequestParam(name = "id") String userId)throws Exception{
        ModelAndView mv = new ModelAndView();
        //1.根據一個用戶ID查詢結果
        UserInfo userInfo = userService.findById(userId);
        //2.根據用戶ID查詢能夠添加的角色
        List<Role> othersRoles = userService.findOthersRoles(userId);
        mv.addObject("user",userInfo);
        mv.addObject("rolesList",othersRoles);
        mv.setViewName("user-role-add2");
        return mv;
    }

 

  DAO層的 IUserDao

  

    // where not in ()
    @Select("select * from role where id not in (select roleId from users_role where userId = #{userId}) ")
    List<Role> findOthersRoles(String userId);

 

 視圖層的UsersControler  

    //給用戶添加選定的角色
    @RequestMapping("/addRoleToUser.do")
    public String addRoleToUser(@RequestParam(name = "userId") String userId,@RequestParam(name = "ids") String[] roleIds ) throws Exception {

        userService.addRoleToUser(userId, roleIds);
        return "redirect:findAll.do";
    }

Service層的接口實現類

 

    //經過ID查詢用戶詳情
    @Override
    public UserInfo findById(String id) throws Exception{

        return userDao.findByUserId(id);
    }
    //經過用戶ID查詢其餘能夠添加的角色
    @Override
    public List<Role> findOthersRoles(String userId) throws Exception {

        return userDao.findOthersRoles(userId);

    }

    /**
     * 給用戶添加選定角色
     *
     * @param userId
     * @param roleIds
     */
    @Override
    public void addRoleToUser(String userId, String[] roleIds) throws Exception{

        for (String roleId:roleIds
             ) {
            userDao.addRoleToUser(userId,roleId);
        }
        }

 DAO層的接口代碼

 

    //插入用戶的新角色DAO層實現
    //mybatis的@Param註解給接口方法形參指定匹配的#{name}
    @Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
    void addRoleToUser(@Param("userId") String userId, @Param("roleId") String roleId);

 

 


 

DAO層 IRoleDAO

    //1.經過roleID查詢Role當前已有的權限
    @Select("select * from ROLE where Id = #{roleId}")
    Role findByRoleId(String roleId) throws Exception;

    //1.先根據角色ID查詢中間表role_permission中已有的權限ID
    //2.再去取權限表中取已有的權限ID集合的補集
    @Select("select * from PERMISSION where id not in(select permissionId from ROLE_PERMISSION where roleId = #{roleId})")
    List<Permission> findOthersPermissoinByRoleId(String roleId)throws Exception;

    //插入角色Role的新權限DAO層實現
    //mybatis的@Param註解給接口方法形參指定匹配的#{name}
    @Insert("insert into ROLE_PERMISSION (roleId,permissionId) values(#{roleId},#{permissionId})")
    void addPermissionToRole(@Param("roleId") String roleId,@Param("permissionId") String permissionId)throws Exception;

 

 Service層  接口實現類

 

    //1.查詢已有的權限根據角色ID
    @Override
    public Role findByRoleId(String roleId) throws Exception {
        return roleDao.findByRoleId(roleId);
    }
    //2.經過角色ID查詢其它能夠添加的權限
    @Override
    public List<Permission> findOthersPermissoin(String roleId) throws Exception{
        return roleDao.findOthersPermissoinByRoleId(roleId);
    }
    /**
     * 3.給角色添加尚未的權限
     */
    @Override
    public void addPermissionToRole(String roleId, String[] permissionsId) throws Exception {

        for (String permissionId:permissionsId
             ) {
            roleDao.addPermissionToRole(roleId,permissionId);
        }

    }

 

 Controller層

    //2.查詢角色還沒擁有的權限
    @RequestMapping("/findRoleByIdAndAllPermission.do")
    public ModelAndView findUserByIdAndAllRole(@RequestParam(name = "id") String roleId)throws Exception{
        ModelAndView mv = new ModelAndView();
        //1.根據一個roleID查詢Role結果
        Role role = roleService.findByRoleId(roleId);
        //2.根據角色ID查詢能夠添加的權限
        List<Permission> otherPermissions = roleService.findOthersPermissoin(roleId);
        mv.addObject("role",role);
        mv.addObject("permissionList",otherPermissions);
        mv.setViewName("role-permission-add2");
        return mv;
    }

    //3.給角色添加未擁有的權限
    @RequestMapping("/addPermissionToRole.do")
    public String addPermissionToRole(@RequestParam(name = "roleId") String roleId,@RequestParam(name = "ids") String[] permissionsId) throws Exception{
        roleService.addPermissionToRole(roleId,permissionsId);
        return "redirect:findAll.do";
    }

 

 7.方法級別權限控制--JSR250註解的使用 

2.JSR250註解使用介紹

  pom.xml導入依賴座標

        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
        </dependency>

  一、在web項目子模塊的 spring-security.xml中添加如下配置信息:

    <!-- 開啓JSR-250註解支持 -->
    <security:global-method-security jsr250-annotations="enabled"/>

  二、在指定的視圖層的Controller方法上使用 @RolesAllowed("ADMIN")

  

    //添加產品(後跳轉查詢產品)
    @RequestMapping("/save.do")
    //添加JSR-250註解權限控制
    @RolesAllowed("ADMIN")
    public String save(Product product)throws Exception{
        productService.save(product);
        return "redirect:findAll.do";
    }

 

  @Secured("ROLE_ADMIN")  註解

一、在spring-security.xml裏開啓@Secured註解支持 

    <!--開啓Secured註解支持-->
    <securoty:global-method-security secured-annotations="enabled"/>

二、在指定的視圖層Controller方法上使用  @Secured("ROLE_ADMIN")

 

  10.頁面端權限控制 

  pom.xml導入依賴座標 

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-taglibs</artifactId>
  <version>version</version>
</dependency>

  頁面導入 

<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>

 

 6.4.2.經常使用標籤

jsp中咱們可使用如下三種標籤,其中authentication表明的是當前認證對象,能夠獲取當前認證對象信息,例
如用戶名。其它兩個標籤咱們能夠用於權限控制


  authentication  

<security:authentication property="" htmlEscape="" scope="" var=""/> 

 property: 只容許指定Authentication所擁有的屬性,能夠進行屬性的級聯獲取,如principle.username」
 htmlEscape:表示是否須要將html進行轉義。默認爲true

 scope:與var屬性一塊兒使用,用於指定存放獲取的結果的屬性名的做用範圍,默認爲pageContextJsp中擁
有的做用範圍都進行進行指定
 var: 用於指定一個屬性名,這樣當獲取到了authentication的相關信息後會將其以var指定的屬性名進行存
放,默認是存放在pageConext

 

authorize是用來判斷普通權限的,經過判斷用戶是否具備對應的權限而控制其所包含內容的顯示。

<security:authorize access="" method="" url="" var=""></security:authorize>

 access: 須要使用表達式來判斷權限,當表達式的返回結果爲true時表示擁有對應的權限
 

<!-- <bean id="webexpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" />-->

 

access="hasRole('ADMIN')"

 

 methodmethod屬性是配合url屬性一塊兒使用的,表示用戶應當具備指定url指定method訪問的權限,
 method的默認值爲GET,可選值爲http請求的7種方法
 urlurl表示若是用戶擁有訪問指定url的權限即表示能夠顯示authorize標籤包含的內容
 var:用於指定將權限鑑定的結果存放在pageContext的哪一個屬性中

 

accesscontrollist標籤是用於鑑定ACL權限的。其一共定義了三個屬性:hasPermissiondomainObjectvar
其中前兩個是必須指定的

 

<security:accesscontrollist hasPermission="" domainObject="" var=""></security:accesscontrollist>

 hasPermissionhasPermission屬性用於指定以逗號分隔的權限列表
 domainObjectdomainObject用於指定對應的域對象
 varvar則是用以將鑑定的結果以指定的屬性名存入pageContext中,以供同一頁面的其它地方使用

 

 

====================

end

相關文章
相關標籤/搜索