From c7ba79da98f0c9fc062af1690f794486fe0c6f08 Mon Sep 17 00:00:00 2001
From: mrz <17966059@qq.com>
Date: Mon, 18 Feb 2019 14:06:40 +0800
Subject: [PATCH] spring security 用户登录部分完成

---
 .gitignore                                                               |  1 +
 config/config.properties                                                 | 10 +++++-----
 pom.xml                                                                  |  5 +++++
 src/main/java/com/tianbo/warehouse/WarehouseApplication.java             |  3 +++
 src/main/java/com/tianbo/warehouse/controller/AdminController.java       | 21 +++++++++++++++++++++
 src/main/java/com/tianbo/warehouse/controller/ImfLog.java                | 20 ++++++++++++--------
 src/main/java/com/tianbo/warehouse/controller/IndexController.java       |  3 ++-
 src/main/java/com/tianbo/warehouse/controller/Login.java                 | 13 +++++++++++++
 src/main/java/com/tianbo/warehouse/controller/MainController.java        | 28 ++++++++++++++++++++++++++++
 src/main/java/com/tianbo/warehouse/dao/USERSMapper.java                  |  2 ++
 src/main/java/com/tianbo/warehouse/imf/IMF_Sender.java                   |  3 +--
 src/main/java/com/tianbo/warehouse/model/PERMISSION.java                 | 12 +++++++++++-
 src/main/java/com/tianbo/warehouse/model/ROLE.java                       |  9 +++------
 src/main/java/com/tianbo/warehouse/model/USERS.java                      | 15 ++++++++++++---
 src/main/java/com/tianbo/warehouse/schedul/IMF_Task.java                 |  3 ++-
 src/main/java/com/tianbo/warehouse/security/CustomUserDetailService.java | 20 --------------------
 src/main/java/com/tianbo/warehouse/security/WebSecurityConfig.java       | 43 +++++++++++++++++++++++++++++++------------
 src/main/java/com/tianbo/warehouse/service/UserService.java              |  3 +++
 src/main/java/com/tianbo/warehouse/service/imp/UserServiceImpl.java      | 29 ++++++++++++++++++++++++++++-
 src/main/java/com/tianbo/warehouse/util/XML/MakeImfMeta.java             |  1 +
 src/main/resources/application.properties                                |  6 +++++-
 src/main/resources/mapping/PERMISSIONMapper.xml                          | 34 +++++++++++++++++++++++++++-------
 src/main/resources/mapping/USERSMapper.xml                               |  7 ++++++-
 src/main/resources/static/index.html                                     | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/main/resources/templates/error.html                                  | 36 ++++++++++++++++++++++++++++++++++++
 src/main/resources/templates/home.html                                   |  4 ++--
 src/main/resources/templates/login.html                                  |  4 ++++
 27 files changed, 316 insertions(+), 71 deletions(-)
 create mode 100644 src/main/java/com/tianbo/warehouse/controller/AdminController.java
 create mode 100644 src/main/java/com/tianbo/warehouse/controller/Login.java
 create mode 100644 src/main/java/com/tianbo/warehouse/controller/MainController.java
 create mode 100644 src/main/resources/static/index.html
 create mode 100644 src/main/resources/templates/error.html

diff --git a/.gitignore b/.gitignore
index 2dc430f..6cfe44c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
 .mvn
 /lib/
 /xmlFromImf/
+kakoRevice/
 /errorLogs/
 ### STS ###
 .apt_generated
diff --git a/config/config.properties b/config/config.properties
index 0462de4..5054848 100644
--- a/config/config.properties
+++ b/config/config.properties
@@ -1,13 +1,13 @@
 #登录账号
-loginname = NMMS
+loginname = KAKO
 #登录密码
-loginpass = NMMS
+loginpass = KAKO
 #发送报文目录,相对程序目录
-readDirectory = /Users/mrz/Downloads/1.woowo
+readDirectory = /Users/mrz/Documents/java项目/test
 #接收存储报文目录
-bakDirectory = xmlFromImf
+bakDirectory = kakoRevice
 #是否需要发送报文,默认N不发,Y将发送readDirectory下的XML扩展名的报文
-isNeedSend = N
+isNeedSend = Y
 
 #IMF MEAT报头配置
 
diff --git a/pom.xml b/pom.xml
index 36ead29..eafaf65 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,6 +30,11 @@
 			<artifactId>mybatis-spring-boot-starter</artifactId>
 			<version>1.3.2</version>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-devtools</artifactId>
+			<optional>true</optional>
+		</dependency>
 		<!--有WEBSOCKET包 包含了spring-boot-starter-web 和spring-boot-starter包 有这个包不要引入这俩包-->
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
diff --git a/src/main/java/com/tianbo/warehouse/WarehouseApplication.java b/src/main/java/com/tianbo/warehouse/WarehouseApplication.java
index 03372fb..7e4f1e7 100644
--- a/src/main/java/com/tianbo/warehouse/WarehouseApplication.java
+++ b/src/main/java/com/tianbo/warehouse/WarehouseApplication.java
@@ -6,9 +6,12 @@ package com.tianbo.warehouse;
 
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 
 @SpringBootApplication
 @EnableScheduling
diff --git a/src/main/java/com/tianbo/warehouse/controller/AdminController.java b/src/main/java/com/tianbo/warehouse/controller/AdminController.java
new file mode 100644
index 0000000..4ee986e
--- /dev/null
+++ b/src/main/java/com/tianbo/warehouse/controller/AdminController.java
@@ -0,0 +1,21 @@
+package com.tianbo.warehouse.controller;
+
+import com.tianbo.warehouse.model.USERS;
+import com.tianbo.warehouse.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class AdminController {
+
+    @Autowired
+    UserService userService;
+
+    @GetMapping("/admin")
+    public List<USERS> admin(){
+        return userService.selectAllUser();
+    }
+}
diff --git a/src/main/java/com/tianbo/warehouse/controller/ImfLog.java b/src/main/java/com/tianbo/warehouse/controller/ImfLog.java
index 753faa5..cea8f7d 100644
--- a/src/main/java/com/tianbo/warehouse/controller/ImfLog.java
+++ b/src/main/java/com/tianbo/warehouse/controller/ImfLog.java
@@ -1,14 +1,22 @@
 package com.tianbo.warehouse.controller;
 
 import com.tianbo.warehouse.model.PERMISSION;
+import com.tianbo.warehouse.model.USERS;
+import com.tianbo.warehouse.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import java.util.List;
+
 @Controller
 public class ImfLog {
 
+    @Autowired
+    UserService userService;
+
     @RequestMapping("/log/imf")
     public String IMFlog(){
         return "log/imf";
@@ -24,15 +32,11 @@ public class ImfLog {
         return  "home";
     }
 
-    @RequestMapping("/admin")
+    @RequestMapping("/logs")
     @ResponseBody
-    public String Admin(){
-        return "hello admin";
-    }
-
-    @RequestMapping("/login")
-    public String login(){
-        return "login";
+    public List<USERS> logs(){
+        List<USERS> usersList =userService.selectAllUser();
+        return usersList;
     }
 }
 
diff --git a/src/main/java/com/tianbo/warehouse/controller/IndexController.java b/src/main/java/com/tianbo/warehouse/controller/IndexController.java
index 26b8d27..a777b8f 100644
--- a/src/main/java/com/tianbo/warehouse/controller/IndexController.java
+++ b/src/main/java/com/tianbo/warehouse/controller/IndexController.java
@@ -11,7 +11,8 @@ public class IndexController {
 
     @GetMapping("index")
     public String index(){
-        return "数据仓库接收,落地报文给新舱单";
+        return "forward:/login";
+//        return "数据仓库接收,落地报文给新舱单";
     }
 
 
diff --git a/src/main/java/com/tianbo/warehouse/controller/Login.java b/src/main/java/com/tianbo/warehouse/controller/Login.java
new file mode 100644
index 0000000..023001a
--- /dev/null
+++ b/src/main/java/com/tianbo/warehouse/controller/Login.java
@@ -0,0 +1,13 @@
+package com.tianbo.warehouse.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+public class Login {
+
+    @RequestMapping("/login")
+    public String login(){
+        return "login";
+    }
+}
diff --git a/src/main/java/com/tianbo/warehouse/controller/MainController.java b/src/main/java/com/tianbo/warehouse/controller/MainController.java
new file mode 100644
index 0000000..edd24ab
--- /dev/null
+++ b/src/main/java/com/tianbo/warehouse/controller/MainController.java
@@ -0,0 +1,28 @@
+package com.tianbo.warehouse.controller;
+
+import com.tianbo.warehouse.model.USERS;
+import com.tianbo.warehouse.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class MainController {
+
+    @Autowired
+    UserService userService;
+
+    @GetMapping("/error")
+    public List<USERS> error(){
+        List<USERS> usersList =userService.selectAllUser();
+        return usersList;
+    }
+
+    @GetMapping("/main")
+    public List<USERS> me(){
+        List<USERS> usersList =userService.selectAllUser();
+        return usersList;
+    }
+}
diff --git a/src/main/java/com/tianbo/warehouse/dao/USERSMapper.java b/src/main/java/com/tianbo/warehouse/dao/USERSMapper.java
index 24186f8..24b6219 100644
--- a/src/main/java/com/tianbo/warehouse/dao/USERSMapper.java
+++ b/src/main/java/com/tianbo/warehouse/dao/USERSMapper.java
@@ -20,4 +20,6 @@ public interface USERSMapper {
 
     int updateByPrimaryKey(USERS record);
 
+    List<USERS> selectAllUser();
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/tianbo/warehouse/imf/IMF_Sender.java b/src/main/java/com/tianbo/warehouse/imf/IMF_Sender.java
index 6340fd3..0235564 100644
--- a/src/main/java/com/tianbo/warehouse/imf/IMF_Sender.java
+++ b/src/main/java/com/tianbo/warehouse/imf/IMF_Sender.java
@@ -9,8 +9,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
 import org.xml.sax.SAXParseException;
 
-import java.io.File;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.util.Iterator;
 import java.util.List;
 
diff --git a/src/main/java/com/tianbo/warehouse/model/PERMISSION.java b/src/main/java/com/tianbo/warehouse/model/PERMISSION.java
index baaf07b..a349cfe 100644
--- a/src/main/java/com/tianbo/warehouse/model/PERMISSION.java
+++ b/src/main/java/com/tianbo/warehouse/model/PERMISSION.java
@@ -1,8 +1,13 @@
 package com.tianbo.warehouse.model;
 
+import org.springframework.security.core.GrantedAuthority;
+
 import java.math.BigDecimal;
 
-public class PERMISSION {
+public class PERMISSION  implements GrantedAuthority{
+
+    private static final long serialVersionUID = -3957539165716897200L;
+
     private BigDecimal permissionId;
 
     private String permissionName;
@@ -52,4 +57,9 @@ public class PERMISSION {
     public void setGroupName(String groupName) {
         this.groupName = groupName == null ? null : groupName.trim();
     }
+
+    @Override
+    public String getAuthority(){
+        return this.getPermissionName();
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/tianbo/warehouse/model/ROLE.java b/src/main/java/com/tianbo/warehouse/model/ROLE.java
index b6b74ca..de826b7 100644
--- a/src/main/java/com/tianbo/warehouse/model/ROLE.java
+++ b/src/main/java/com/tianbo/warehouse/model/ROLE.java
@@ -4,9 +4,9 @@ import org.springframework.security.core.GrantedAuthority;
 
 import java.math.BigDecimal;
 
-public class ROLE implements GrantedAuthority{
+public class ROLE{
+
 
-    private static final long serialVersionUID = -3957539165716897200L;
 
     private BigDecimal roleId;
 
@@ -48,8 +48,5 @@ public class ROLE implements GrantedAuthority{
         this.description = description == null ? null : description.trim();
     }
 
-    @Override
-    public String getAuthority(){
-        return this.getRoleName();
-    }
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/tianbo/warehouse/model/USERS.java b/src/main/java/com/tianbo/warehouse/model/USERS.java
index d78c369..c3facc5 100644
--- a/src/main/java/com/tianbo/warehouse/model/USERS.java
+++ b/src/main/java/com/tianbo/warehouse/model/USERS.java
@@ -37,6 +37,8 @@ public class USERS  implements UserDetails{
 
     private List<ROLE> roles;
 
+    private List<PERMISSION> permissions;
+
     public BigDecimal getUserId() {
         return userId;
     }
@@ -127,6 +129,13 @@ public class USERS  implements UserDetails{
         this.roles = roles;
     }
 
+    public List<PERMISSION> getPermissions() {
+        return permissions;
+    }
+
+    public void setPermissions(List<PERMISSION> permissions) {
+        this.permissions = permissions;
+    }
     @Override
     public boolean isAccountNonExpired(){
         return true;
@@ -150,9 +159,9 @@ public class USERS  implements UserDetails{
     @Override
     public Collection<? extends GrantedAuthority> getAuthorities(){
         List<GrantedAuthority> auths = new ArrayList<GrantedAuthority>();
-        List<ROLE> roles = this.getRoles();
-        for (ROLE role : roles) {
-            auths.add(new SimpleGrantedAuthority(role.getAuthority()));
+        List<PERMISSION> permissions = this.getPermissions();
+        for (PERMISSION permission : permissions) {
+            auths.add(new SimpleGrantedAuthority(permission.getAuthority()));
         }
         return auths;
     }
diff --git a/src/main/java/com/tianbo/warehouse/schedul/IMF_Task.java b/src/main/java/com/tianbo/warehouse/schedul/IMF_Task.java
index 94d7479..8b43c39 100644
--- a/src/main/java/com/tianbo/warehouse/schedul/IMF_Task.java
+++ b/src/main/java/com/tianbo/warehouse/schedul/IMF_Task.java
@@ -24,7 +24,7 @@ public class IMF_Task {
     public static String isNeedSend = "N";
 
 
-    @Scheduled(fixedRate = 5000)
+//    @Scheduled(fixedRate = 5000)
     private static void start() throws Exception {
         PropertyConfigurator.configure("config/log4j.properties");
         client = IMFClientFactory.createInstance();
@@ -41,6 +41,7 @@ public class IMF_Task {
         //启动读取线程
         if (client != null) {
             IMF_Reader reader = new IMF_Reader(client);
+
             if (!IMF_Reader.isrunning) {
                 reader.start();
                 logger.info("*********读取线程已开启***********");
diff --git a/src/main/java/com/tianbo/warehouse/security/CustomUserDetailService.java b/src/main/java/com/tianbo/warehouse/security/CustomUserDetailService.java
index b55248a..ce1dd18 100644
--- a/src/main/java/com/tianbo/warehouse/security/CustomUserDetailService.java
+++ b/src/main/java/com/tianbo/warehouse/security/CustomUserDetailService.java
@@ -1,14 +1,8 @@
 package com.tianbo.warehouse.security;
 
-import com.tianbo.warehouse.dao.PERMISSIONMapper;
-import com.tianbo.warehouse.dao.USERSMapper;
-import com.tianbo.warehouse.model.PERMISSION;
 import com.tianbo.warehouse.model.USERS;
 import com.tianbo.warehouse.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
@@ -22,26 +16,12 @@ public class CustomUserDetailService implements UserDetailsService {
 
     @Autowired
     UserService userService;
-    @Autowired
-    PERMISSIONMapper permissionMapper;
 
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
 
         try {
             USERS user = userService.loadByUsername(username);
-
-            //这里是根据用户ID取的权限表,还可以根据用户ID 去角色表
-            List<PERMISSION> permissions = permissionMapper.findByUserId(user.getUserId());
-            List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
-            for (PERMISSION permission : permissions) {
-                if (permission != null && permission.getPermissionName() != null) {
-
-                    GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(permission.getPermissionName());
-                    //1:此处将权限信息添加到 GrantedAuthority 对象中,在后面进行全权限验证时会使用GrantedAuthority 对象。
-                    grantedAuthorities.add(grantedAuthority);
-                }
-            }
             return user;
         } catch (UsernameNotFoundException e) {
 
diff --git a/src/main/java/com/tianbo/warehouse/security/WebSecurityConfig.java b/src/main/java/com/tianbo/warehouse/security/WebSecurityConfig.java
index 0fdfe17..10826ea 100644
--- a/src/main/java/com/tianbo/warehouse/security/WebSecurityConfig.java
+++ b/src/main/java/com/tianbo/warehouse/security/WebSecurityConfig.java
@@ -1,7 +1,7 @@
 package com.tianbo.warehouse.security;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -21,29 +21,48 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     @Autowired
     private  PasswordEncoder passwordEncoder;
 
-    @Bean
-    UserDetailsService customUserService(){ //注册UserDetailsService 的bean
-        return new CustomUserDetailService();
-    }
+    @Qualifier("customuserservice")
+    @Autowired
+    private  UserDetailsService userDetailsService;
 
     @Override
     protected void configure(AuthenticationManagerBuilder  auth) throws Exception {
         //user Details Service验证
-        auth.userDetailsService(customUserService()).passwordEncoder(passwordEncoder);
+        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
     }
 
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         http.authorizeRequests()
-                .anyRequest().authenticated() //任何请求,登录后可以访问
+                .antMatchers("/admin","/role").authenticated()
+                //管理页面只允许管理员角色访问  //任何请求,登录后可以访问
+                .anyRequest().permitAll() //其余的不需要验证
                 .and()
                 .formLogin()
-                .loginProcessingUrl("/home")
+                .passwordParameter("password")
+                .usernameParameter("username")
+                //.loginProcessingUrl("/home")//登陆提交的处理url
                 .loginPage("/login")
-                .failureUrl("/login?error")
-                .permitAll() //登录页面用户任意访问
+                .failureUrl("/error")
+                .permitAll()//登录页面用户任意访问
+                .successForwardUrl("/main")
+                .and()
+                .logout()
+                .logoutSuccessUrl("/?logout=true")
+                .permitAll()
                 .and()
-                .logout().permitAll(); //注销行为任意访问
-        http.addFilterBefore(myFilterSecurityInterceptor, FilterSecurityInterceptor.class);
+                .rememberMe()
+                .tokenValiditySeconds(604800)
+                //记住我功能,cookies有限期是一周
+                .rememberMeParameter("remeberme")
+                //登陆时是否激活记住我功能的参数名字,在登陆页面有展示
+                .rememberMeCookieName("workspace")
+                //cookies的名字,登陆后可以通过浏览器查看cookies名字
+                .and()
+                .cors()
+                .and()
+                .csrf().disable();
+
+        //http.addFilterBefore(myFilterSecurityInterceptor, FilterSecurityInterceptor.class).csrf().disable();
     }
 }
diff --git a/src/main/java/com/tianbo/warehouse/service/UserService.java b/src/main/java/com/tianbo/warehouse/service/UserService.java
index 6ce8945..96805c8 100644
--- a/src/main/java/com/tianbo/warehouse/service/UserService.java
+++ b/src/main/java/com/tianbo/warehouse/service/UserService.java
@@ -2,6 +2,9 @@ package com.tianbo.warehouse.service;
 
 import com.tianbo.warehouse.model.USERS;
 
+import java.util.List;
+
 public interface UserService {
     USERS loadByUsername(String username);
+    List<USERS> selectAllUser();
 }
diff --git a/src/main/java/com/tianbo/warehouse/service/imp/UserServiceImpl.java b/src/main/java/com/tianbo/warehouse/service/imp/UserServiceImpl.java
index 511f777..88b5ffa 100644
--- a/src/main/java/com/tianbo/warehouse/service/imp/UserServiceImpl.java
+++ b/src/main/java/com/tianbo/warehouse/service/imp/UserServiceImpl.java
@@ -1,7 +1,9 @@
 package com.tianbo.warehouse.service.imp;
 
+import com.tianbo.warehouse.dao.PERMISSIONMapper;
 import com.tianbo.warehouse.dao.ROLEMapper;
 import com.tianbo.warehouse.dao.USERSMapper;
+import com.tianbo.warehouse.model.PERMISSION;
 import com.tianbo.warehouse.model.ROLE;
 import com.tianbo.warehouse.model.USERS;
 import com.tianbo.warehouse.service.UserService;
@@ -19,6 +21,9 @@ public class UserServiceImpl implements UserService{
     @Autowired
     private ROLEMapper roleMapper;
 
+    @Autowired
+    private PERMISSIONMapper permissionMapper;
+
     @Override
     public USERS loadByUsername(String username){
         List<USERS> userList = usersMapper.selectByUsername(username);
@@ -26,13 +31,35 @@ public class UserServiceImpl implements UserService{
         if (userList != null && userList.size() > 0) {
             USERS user = userList.get(0);
 
+            List<PERMISSION> permissionList = permissionMapper.findByUserId(user.getUserId());
+            if (permissionList!=null && permissionList.size()>0){
+                user.setPermissions(permissionList);
+            }
+
             List<ROLE> roleList = roleMapper.findRolesByUserId(user.getUserId());
             if (roleList!=null && roleList.size()>0){
                 user.setRoles(roleList);
-                return user;
             }
+            return user;
         }
         return null;
 
     }
+
+    @Override
+    public List<USERS> selectAllUser(){
+        List<USERS> list = usersMapper.selectAllUser();
+        for (USERS user: list) {
+            List<PERMISSION> permissionList = permissionMapper.findByUserId(user.getUserId());
+            if (permissionList!=null && permissionList.size()>0){
+                user.setPermissions(permissionList);
+            }
+
+            List<ROLE> roleList = roleMapper.findRolesByUserId(user.getUserId());
+            if (roleList!=null && roleList.size()>0){
+                user.setRoles(roleList);
+            }
+        }
+        return list;
+    }
 }
diff --git a/src/main/java/com/tianbo/warehouse/util/XML/MakeImfMeta.java b/src/main/java/com/tianbo/warehouse/util/XML/MakeImfMeta.java
index 9d53408..e97410f 100644
--- a/src/main/java/com/tianbo/warehouse/util/XML/MakeImfMeta.java
+++ b/src/main/java/com/tianbo/warehouse/util/XML/MakeImfMeta.java
@@ -25,6 +25,7 @@ public class MakeImfMeta {
         meta.addElement("STYP").addText(STYP);
 
         SAXReader saxReader = new SAXReader();
+//        saxReader.setEncoding("gb2312");
         Document doc = saxReader.read(Content);
         Element contentRoot = doc.getRootElement();
         root.add(contentRoot);
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index f46e3ce..e4d626c 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -41,10 +41,14 @@ spring.datasource.druid.test-on-borrow=false
 spring.datasource.druid.test-on-return=false
 spring.datasource.druid.default-auto-commit=true
 
+#security配置
+trace=true
+
 mybatis.mapper-locations=classpath:mapping/*.xml
 mybatis.type-aliases-package=com.tianbo.warehouse.model
 logging.level.com.tianbo.warehouse.dao=DEBUG
-
+logging.level.org.springframework.security =debug
+debug=true
 pagehelper.helper-dialect=oracle
 #pagehelper.auto-dialect=true
 #pagehelper.auto-runtime-dialect=true
diff --git a/src/main/resources/mapping/PERMISSIONMapper.xml b/src/main/resources/mapping/PERMISSIONMapper.xml
index 8e16cf6..144fce7 100644
--- a/src/main/resources/mapping/PERMISSIONMapper.xml
+++ b/src/main/resources/mapping/PERMISSIONMapper.xml
@@ -23,13 +23,33 @@
     from PERMISSION
   </select>
   <select id="findByUserId" parameterType="java.math.BigDecimal" resultMap="BaseResultMap">
-    select p.*
-    from USERS u
-    LEFT JOIN USER_ROLE ur on u.user_id= ur.user_id
-    LEFT JOIN ROLE r on ur.role_id=r.role_id
-    LEFT JOIN ROLE_PERMISSION rp on rp.role_id=r.role_id
-    LEFT JOIN PERMISSION p on p.PERMISSION_ID =rp.permission_id
-    where u.USER_ID = #{userId,jdbcType=DECIMAL}
+    SELECT
+	P .*
+FROM
+	PERMISSION P
+WHERE
+	P .PERMISSION_ID IN (
+		SELECT
+			RP.permission_id
+		FROM
+			ROLE_PERMISSION RP
+		WHERE
+			RP.role_id IN (
+				SELECT
+					R.ROLE_ID
+				FROM
+					ROLE R
+				WHERE
+					R.ROLE_ID IN (
+						SELECT
+							UR.ROLE_ID
+						FROM
+							USER_ROLE UR
+						WHERE
+							UR.USER_ID = #{userId,jdbcType=DECIMAL}
+					)
+			)
+	)
   </select>
 
   <delete id="deleteByPrimaryKey" parameterType="java.math.BigDecimal" >
diff --git a/src/main/resources/mapping/USERSMapper.xml b/src/main/resources/mapping/USERSMapper.xml
index 0960dc6..29e0764 100644
--- a/src/main/resources/mapping/USERSMapper.xml
+++ b/src/main/resources/mapping/USERSMapper.xml
@@ -24,10 +24,15 @@
     where USER_ID = #{userId,jdbcType=DECIMAL}
   </select>
   <select id="selectByUsername" resultMap="BaseResultMap" parameterType="java.lang.String" >
+  select
+  <include refid="Base_Column_List" />
+  from USERS
+  where USERNAME = #{username,jdbcType=VARCHAR}
+</select>
+  <select id="selectAllUser" resultMap="BaseResultMap" >
     select
     <include refid="Base_Column_List" />
     from USERS
-    where USERNAME = #{username,jdbcType=VARCHAR}
   </select>
   <delete id="deleteByPrimaryKey" parameterType="java.math.BigDecimal" >
     delete from USERS
diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html
new file mode 100644
index 0000000..8b7fa77
--- /dev/null
+++ b/src/main/resources/static/index.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta content="text/html;charset=UTF-8"/>
+    <title>登录页面</title>
+    <link rel="stylesheet" th:href="@{css/bootstrap.min.css}"/>
+    <style type="text/css">
+        body {
+            padding-top: 50px;
+        }
+        .starter-template {
+            padding: 40px 15px;
+            text-align: center;
+        }
+    </style>
+</head>
+<body>
+
+<nav class="navbar navbar-inverse navbar-fixed-top">
+    <div class="container">
+        <div class="navbar-header">
+            <a class="navbar-brand" href="#">Spring Security演示</a>
+        </div>
+        <div id="navbar" class="collapse navbar-collapse">
+            <ul class="nav navbar-nav">
+                <li><a th:href="@{/}"> 首页 </a></li>
+
+            </ul>
+        </div><!--/.nav-collapse -->
+    </div>
+</nav>
+<div class="container">
+
+    <div class="starter-template">
+        <p th:if="${param.logout}" class="bg-warning">已成功注销</p><!-- 1 -->
+        <p th:if="${param.error}" class="bg-danger">有错误,请重试</p> <!-- 2 -->
+        <h2>使用账号密码登录</h2>
+        <form name="form" th:action="@{/login}" action="/login" method="POST"> <!-- 3 -->
+            <div class="form-group">
+                <label for="username">账号</label>
+                <input type="text" class="form-control" name="username" value="" placeholder="账号" />
+            </div>
+            <div class="form-group">
+                <label for="password">密码</label>
+                <input type="password" class="form-control" name="password" placeholder="密码" />
+            </div>
+            <input type="submit" id="login" value="Login" class="btn btn-primary" />
+        </form>
+    </div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html
new file mode 100644
index 0000000..ea95ce2
--- /dev/null
+++ b/src/main/resources/templates/error.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta content="text/html;charset=UTF-8"/>
+    <title>错误页面</title>
+    <link rel="stylesheet" th:href="@{css/bootstrap.min.css}"/>
+    <style type="text/css">
+        body {
+            padding-top: 50px;
+        }
+        .starter-template {
+            padding: 40px 15px;
+            text-align: center;
+        }
+    </style>
+</head>
+<body>
+
+<nav class="navbar navbar-inverse navbar-fixed-top">
+    <div class="container">
+        <div class="navbar-header">
+            <a class="navbar-brand" href="#">Spring Security演示</a>
+        </div>
+        <div id="navbar" class="collapse navbar-collapse">
+            <ul class="nav navbar-nav">
+                <li><a th:href="@{/}"> 首页 </a></li>
+
+            </ul>
+        </div><!--/.nav-collapse -->
+    </div>
+</nav>
+<div class="container">
+
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html
index f27cab0..2e407b1 100644
--- a/src/main/resources/templates/home.html
+++ b/src/main/resources/templates/home.html
@@ -36,10 +36,10 @@
     <div class="starter-template">
         <h1 th:text="${msg.description}"></h1>
 
-        <p class="bg-primary" th:text="${msg.content}"></p>
+        <p class="bg-primary" th:text="${msg.description}"></p>
 
         <div sec:authorize="hasRole('ROLE_HOME')"> <!-- 用户类型为ROLE_ADMIN 显示 -->
-            <p class="bg-info" th:text="${msg.etraInfo}"></p>
+            <p class="bg-info" th:text="${msg.description}"></p>
         </div>
         <div sec:authorize="hasRole('ROLE_ADMIN')"> <!-- 用户类型为ROLE_ADMIN 显示 -->
             <p class="bg-info">恭喜您,您有 ROLE_ADMIN 权限 </p>
diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html
index 8b7fa77..87806e3 100644
--- a/src/main/resources/templates/login.html
+++ b/src/main/resources/templates/login.html
@@ -44,6 +44,10 @@
                 <label for="password">密码</label>
                 <input type="password" class="form-control" name="password" placeholder="密码" />
             </div>
+            <div class="form-group">
+                <label for="remeberme">记住我</label>
+                <input type="checkbox" name="remember-me" />
+            </div>
             <input type="submit" id="login" value="Login" class="btn btn-primary" />
         </form>
     </div>
--
libgit2 0.24.0