完善根据用户获取角色、根据用户获取权限的接口
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/security/Api1SecurityUserController.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/security/Api1SecurityUserController.java
index 8669e6c..f6b76db 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/security/Api1SecurityUserController.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/security/Api1SecurityUserController.java
@@ -1,5 +1,7 @@
 package com.supwisdom.leaveschool.user.controller.api.security;
 
+import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.util.MimeTypeUtils;
@@ -10,8 +12,12 @@
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.supwisdom.leaveschool.user.domain.Permission;
+import com.supwisdom.leaveschool.user.domain.Role;
 import com.supwisdom.leaveschool.user.domain.User;
 import com.supwisdom.leaveschool.user.model.SecurityUser;
+import com.supwisdom.leaveschool.user.repository.PermissionRepository;
+import com.supwisdom.leaveschool.user.repository.RoleRepository;
 import com.supwisdom.leaveschool.user.repository.UserRepository;
 
 @RestController
@@ -20,7 +26,13 @@
 
   @Autowired
   private UserRepository userRepository;
-  
+
+  @Autowired
+  private RoleRepository roleRepository;
+
+  @Autowired
+  private PermissionRepository permissionRepository;
+
   /**
    * 
    * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:10010/api/v1/security/users/test001'
@@ -77,9 +89,39 @@
       throw new RuntimeException("exception.get.domain.not.exist"); // FIXME: RestException
     }
     
+    List<Role> roles = roleRepository.selectByUsername(username);
+    
     SecurityUser securityUser = new SecurityUser();
     securityUser.setUser(user);
+    securityUser.setRoles(roles);
 
     return securityUser;
   }
+  
+  @GetMapping(path = "/{username}/{applicationCode}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  @ResponseStatus(value = HttpStatus.OK)
+  @ResponseBody
+  public SecurityUser loadPermissionsByUsernameAppcode(@PathVariable("username") String username, @PathVariable("applicationCode") String applicationCode) {
+    
+    if (username == null || username.length() == 0) {
+      throw new RuntimeException("exception.get.username.must.not.empty"); // FIXME: RestException
+    }
+
+    User user = userRepository.selectByUsername(username);
+
+    if (user == null) {
+      throw new RuntimeException("exception.get.domain.not.exist"); // FIXME: RestException
+    }
+    
+    List<Role> roles = roleRepository.selectByUsername(username);
+    
+    List<Permission> permissions = permissionRepository.selectByUsername(username, applicationCode);
+    
+    SecurityUser securityUser = new SecurityUser();
+    securityUser.setUser(user);
+    securityUser.setRoles(roles);
+    securityUser.setPermissions(permissions);
+    
+    return securityUser;
+  }
 }
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/Group.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/Group.java
index c99150f..cc3a73d 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/Group.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/Group.java
@@ -6,7 +6,7 @@
 
 import com.supwisdom.leaveschool.common.domain.ABaseDomain;
 
-@Entity
+@Entity(name = "Group_")
 @Table(name = "TB_U_GROUP")
 public class Group extends ABaseDomain {
 
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/PermissionRepository.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/PermissionRepository.java
index fc1a5c3..f9f727e 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/PermissionRepository.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/PermissionRepository.java
@@ -1,11 +1,16 @@
 package com.supwisdom.leaveschool.user.repository;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.springframework.data.domain.Example;
 import org.springframework.data.domain.ExampleMatcher;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import com.supwisdom.leaveschool.common.repository.BaseJpaRepository;
@@ -38,4 +43,68 @@
     return page;
   }
   
+
+
+  public default Permission selectByCodeType(String applicationCode, String type) {
+    Permission probe = new Permission();
+    probe.setCode(applicationCode);
+    probe.setType(type);
+    
+    ExampleMatcher matcher = ExampleMatcher.matching()
+        .withMatcher("code", ExampleMatcher.GenericPropertyMatchers.exact())
+        .withMatcher("type", ExampleMatcher.GenericPropertyMatchers.exact());
+    
+    Example<Permission> example = Example.of(probe, matcher);
+    
+    Optional<Permission> o = this.findOne(example);
+    
+    if (o.isPresent()) {
+      return o.get();
+    }
+    
+    return null;
+  }
+  
+ 
+
+  @Query(value = "select p from Permission p "
+      + "inner join RolePermission rp on p.id=rp.permissionId "
+      + "inner join Role r on rp.rolecode=r.code "
+      + "inner join UserRole ur on r.code=ur.rolecode "
+      + "where ur.username=:username "
+      + "and p.lft >= :lft and p.rgt <= :rgt "
+      + "and r.status='1' and p.status='1' ")
+  public List<Permission> selectUserRolePermissionByUsername(@Param("username") String username, @Param("lft") int lft, @Param("rgt") int rgt);
+  
+  @Query(value = "select p from Permission p "
+      + "inner join RolePermission rp on p.id=rp.permissionId "
+      + "inner join Role r on rp.rolecode=r.code "
+      + "inner join GroupRole gr on r.code=gr.rolecode "
+      + "inner join Group_ g on gr.groupId=g.id "
+      + "inner join UserGroup ug on g.id=ug.groupId "
+      + "where ug.username=:username "
+      + "and p.lft >= :lft and p.rgt <= :rgt "
+      + "and g.status='1' and r.status='1' and p.status='1' ")
+  public List<Permission> selectUserGroupRolePermissionByUsername(@Param("username") String username, @Param("lft") int lft, @Param("rgt") int rgt);
+
+  public default List<Permission> selectByUsername(String username, String applicationCode) {
+    List<Permission> permissions = new ArrayList<Permission>();
+    
+    Permission applicationPermission = selectByCodeType(applicationCode, "1");
+    if (applicationPermission == null) {
+      return permissions;
+    }
+    
+    int lft = applicationPermission.getLft();
+    int rgt = applicationPermission.getRgt();
+    
+    List<Permission> userRolePermissions = selectUserRolePermissionByUsername(username, lft, rgt);
+    permissions.addAll(userRolePermissions);
+    
+    List<Permission> userGroupRolePermissions = selectUserGroupRolePermissionByUsername(username, lft, rgt);
+    permissions.addAll(userGroupRolePermissions);
+    
+    return permissions;
+  }
+
 }
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/RoleRepository.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/RoleRepository.java
index 18bda86..3871a3f 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/RoleRepository.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/RoleRepository.java
@@ -1,5 +1,7 @@
 package com.supwisdom.leaveschool.user.repository;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
@@ -7,6 +9,8 @@
 import org.springframework.data.domain.ExampleMatcher;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import com.supwisdom.leaveschool.common.repository.BaseJpaRepository;
@@ -58,4 +62,30 @@
     return null;
   }
   
+  @Query(value = "select r from Role r "
+      + "inner join UserRole ur on r.code=ur.rolecode "
+      + "where ur.username=:username "
+      + "and r.status='1' ")
+  public List<Role> selectUserRoleByUsername(@Param("username") String username);
+  
+  @Query(value = "select r from Role r "
+      + "inner join GroupRole gr on r.code=gr.rolecode "
+      + "inner join Group_ g on gr.groupId=g.id "
+      + "inner join UserGroup ug on g.id=ug.groupId "
+      + "where ug.username=:username "
+      + "and g.status='1' and r.status='1' ")
+  public List<Role> selectUserGroupRoleByUsername(@Param("username") String username);
+
+  public default List<Role> selectByUsername(String username) {
+    List<Role> roles = new ArrayList<Role>();
+    
+    List<Role> userRoles = selectUserRoleByUsername(username);
+    roles.addAll(userRoles);
+    
+    List<Role> userGroupRoles = selectUserGroupRoleByUsername(username);
+    roles.addAll(userGroupRoles);
+    
+    return roles;
+  }
+  
 }