Skip to content

Commit 5b89a64

Browse files
committed
...
1 parent 40696eb commit 5b89a64

File tree

7 files changed

+171
-46
lines changed

7 files changed

+171
-46
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@
4848

4949
<dependency>
5050
<groupId>org.apache.shiro</groupId>
51-
<artifactId>shiro-all</artifactId>
52-
<version>1.2.3</version>
51+
<artifactId>shiro-spring</artifactId>
52+
<version>1.3.2</version>
5353
</dependency>
5454
</dependencies>
5555

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.howie.shiro.config;
2+
3+
import com.howie.shiro.shiro.CustomRealm;
4+
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
5+
import org.apache.shiro.web.filter.authc.LogoutFilter;
6+
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import org.apache.shiro.mgt.SecurityManager;
10+
11+
import javax.servlet.Filter;
12+
import java.util.LinkedHashMap;
13+
import java.util.Map;
14+
15+
/**
16+
* Created with IntelliJ IDEA
17+
*
18+
* @Author yuanhaoyue swithaoy@gmail.com
19+
* @Description shiro 配置
20+
* @Date 2018-03-28
21+
* @Time 17:21
22+
*/
23+
@Configuration
24+
public class ShiroConfig {
25+
/**
26+
* ShiroFilterFactoryBean 处理拦截资源文件问题。
27+
* 注意:单独一个 ShiroFilterFactoryBean 配置是或报错的,
28+
* 因为在初始化 ShiroFilterFactoryBean 的时候需要注入 SecurityManager
29+
* <p>
30+
* Filter Chain 定义说明
31+
* 1、一个 URL 可以配置多个 Filter ,使用逗号分隔
32+
* 2、当设置多个过滤器时,全部验证通过,才视为通过
33+
* 3、部分过滤器可指定参数,如 perms,roles
34+
*/
35+
@Bean
36+
public ShiroFilterFactoryBean shirFilter() {
37+
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
38+
shiroFilterFactoryBean.setSecurityManager(securityManager());
39+
40+
Map<String, Filter> filters = new LinkedHashMap<>();
41+
LogoutFilter logoutFilter = new LogoutFilter();
42+
logoutFilter.setRedirectUrl("/login");
43+
// filters.put("logout",null);
44+
shiroFilterFactoryBean.setFilters(filters);
45+
46+
Map<String, String> filterChainDefinitionManager = new LinkedHashMap<>();
47+
filterChainDefinitionManager.put("/logout", "logout");
48+
filterChainDefinitionManager.put("/user/**", "authc,roles[ROLE_USER]");
49+
filterChainDefinitionManager.put("/events/**", "authc,roles[ROLE_ADMIN]");
50+
// filterChainDefinitionManager.put("/user/edit/**", "authc,perms[user:edit]");// 这里为了测试,固定写死的值,也可以从数据库或其他配置中读取
51+
filterChainDefinitionManager.put("/**", "anon");
52+
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionManager);
53+
54+
55+
shiroFilterFactoryBean.setSuccessUrl("/");
56+
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
57+
return shiroFilterFactoryBean;
58+
}
59+
60+
@Bean
61+
public SecurityManager securityManager() {
62+
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
63+
// 设置realm.
64+
securityManager.setRealm(new CustomRealm());
65+
return securityManager;
66+
}
67+
}

src/main/java/com/howie/shiro/controller/TestController.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
package com.howie.shiro.controller;
22

33
import com.howie.shiro.mapper.UserMapper;
4+
import org.apache.shiro.SecurityUtils;
5+
import org.apache.shiro.authc.UsernamePasswordToken;
46
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.ui.Model;
8+
import org.springframework.web.bind.annotation.RequestMapping;
9+
import org.springframework.web.bind.annotation.RequestMethod;
10+
import org.springframework.web.bind.annotation.ResponseBody;
511
import org.springframework.web.bind.annotation.RestController;
612

13+
import java.util.LinkedHashMap;
14+
import java.util.Map;
15+
716
/**
817
* Created with IntelliJ IDEA
918
*
@@ -20,4 +29,17 @@ public class TestController {
2029
public TestController(UserMapper userMapper) {
2130
this.userMapper = userMapper;
2231
}
32+
33+
@RequestMapping(value="/login",method= RequestMethod.GET)
34+
public String submitLogin() {
35+
try {
36+
37+
UsernamePasswordToken token = new UsernamePasswordToken("howie",
38+
"123456");
39+
SecurityUtils.getSubject().login(token);
40+
return "成功";
41+
} catch (Exception ignored) {
42+
return "失败";
43+
}
44+
}
2345
}

src/main/java/com/howie/shiro/mapper/UserMapper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
* @Date 2018-03-25
1111
* @Time 22:04
1212
*/
13-
@Repository
1413
public interface UserMapper {
1514
String getPassword(String username);
1615
}
Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
package com.howie.shiro.shiro;
22

33
import com.howie.shiro.mapper.UserMapper;
4+
import org.apache.shiro.SecurityUtils;
45
import org.apache.shiro.authc.AuthenticationException;
56
import org.apache.shiro.authc.AuthenticationInfo;
67
import org.apache.shiro.authc.AuthenticationToken;
78
import org.apache.shiro.authc.SimpleAuthenticationInfo;
89
import org.apache.shiro.authz.AuthorizationInfo;
10+
import org.apache.shiro.authz.SimpleAuthorizationInfo;
911
import org.apache.shiro.realm.AuthorizingRealm;
1012
import org.apache.shiro.subject.PrincipalCollection;
1113
import org.springframework.beans.factory.annotation.Autowired;
1214
import org.springframework.context.annotation.Configuration;
1315
import org.springframework.stereotype.Component;
1416

17+
import javax.annotation.Resource;
18+
import java.util.HashSet;
19+
import java.util.Set;
20+
1521
/**
1622
* Created with IntelliJ IDEA
1723
*
@@ -20,29 +26,23 @@
2026
* @Date 2018-03-25
2127
* @Time 21:46
2228
*/
23-
@Configuration
2429
public class CustomRealm extends AuthorizingRealm {
25-
private final UserMapper userMapper;
26-
2730
@Autowired
28-
public CustomRealm(UserMapper userMapper) {
29-
this.userMapper = userMapper;
30-
}
31+
private UserMapper userMapper;
3132

3233
/**
3334
* 获取身份验证信息
35+
* Shiro中,最终是通过 Realm 来获取应用程序中的用户、角色及权限信息的。
36+
*
3437
* @param authenticationToken 用户身份信息 token
35-
* @return
38+
* @return 返回封装了用户信息的 AuthenticationInfo 实例
3639
*/
3740
@Override
3841
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
3942
// 第一步从 token 中取出身份信息
4043
String username = (String) authenticationToken.getPrincipal();
4144
// 第二步:根据用户输入的userCode从数据库查询,如果查询不到返回null
4245
String password = userMapper.getPassword(username);
43-
if (password == null) {
44-
return null;
45-
}
4646
// 如果查询到返回认证信息AuthenticationInfo
4747
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
4848
username, password, this.getName());
@@ -51,11 +51,38 @@ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authent
5151

5252
/**
5353
* 获取授权信息
54+
*
5455
* @param principalCollection
5556
* @return
5657
*/
5758
@Override
5859
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
60+
// System.out.println("权限认证方法:MyShiroRealm.doGetAuthenticationInfo()");
61+
// SysUser token = (SysUser) SecurityUtils.getSubject().getPrincipal();
62+
// String userId = token.getId();
63+
// SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
64+
// //根据用户ID查询角色(role),放入到Authorization里。
65+
// /*Map<String, Object> map = new HashMap<String, Object>();
66+
// map.put("user_id", userId);
67+
// List<SysRole> roleList = sysRoleService.selectByMap(map);
68+
// Set<String> roleSet = new HashSet<String>();
69+
// for(SysRole role : roleList){
70+
// roleSet.add(role.getType());
71+
// }*/
72+
// //实际开发,当前登录用户的角色和权限信息是从数据库来获取的,我这里写死是为了方便测试
73+
// Set<String> roleSet = new HashSet<>();
74+
// roleSet.add("100002");
75+
// info.setRoles(roleSet);
76+
// //根据用户ID查询权限(permission),放入到Authorization里。
77+
// /*List<SysPermission> permissionList = sysPermissionService.selectByMap(map);
78+
// Set<String> permissionSet = new HashSet<String>();
79+
// for(SysPermission Permission : permissionList){
80+
// permissionSet.add(Permission.getName());
81+
// }*/
82+
// Set<String> permissionSet = new HashSet<String>();
83+
// permissionSet.add("权限添加");
84+
// info.setStringPermissions(permissionSet);
85+
// return info;
5986
return null;
6087
}
6188
}

src/main/resources/application.properties

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,15 @@ spring.datasource.username = root
33
spring.datasource.password = 980509
44
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
55

6-
mybatis.mapperLocations = classpath:mapper/**/*.xml
6+
mybatis.mapperLocations = classpath:mapper/**/*.xml
7+
8+
#log
9+
logging.file=log/log.log
10+
#logging.level.root=debug
11+
logging.level.com.howie.shiro.mapper=DEBUG
12+
# ¿ØÖÆÌ¨ÈÕÖ¾Êä³ö¼¶±ð
13+
logging.level.org.springframework.web=DEBUG
14+
15+
spring.webservices.servlet.load-on-startup=1
16+
spring.jersey.servlet.load-on-startup=1
17+
spring.mvc.servlet.load-on-startup=1
Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.howie.shiro;
22

3+
import com.howie.shiro.mapper.UserMapper;
34
import org.apache.shiro.SecurityUtils;
4-
import org.apache.shiro.authc.AuthenticationException;
55
import org.apache.shiro.authc.UsernamePasswordToken;
66
import org.apache.shiro.config.IniSecurityManagerFactory;
77
import org.apache.shiro.mgt.SecurityManager;
@@ -23,35 +23,34 @@
2323
@RunWith(SpringRunner.class)
2424
@SpringBootTest
2525
public class LoginTest {
26-
/**
27-
* 用户登陆和退出
28-
*/
29-
@Test
30-
public void testLoginAndLogout() {
31-
// 创建 securityManager 工厂,通过ini配置文件创建 securityManager 工厂
32-
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
33-
"classpath:shiro.ini");
34-
// 创建 SecurityManager
35-
SecurityManager securityManager = factory.getInstance();
36-
// 将 securityManager 设置当前的运行环境中
37-
SecurityUtils.setSecurityManager(securityManager);
38-
// 从SecurityUtils里边创建一个 subject
39-
Subject subject = SecurityUtils.getSubject();
40-
41-
// 在认证提交前准备 token(令牌)
42-
// 这里的账号和密码 将来是由用户输入进去
43-
UsernamePasswordToken token = new UsernamePasswordToken("howie",
44-
"123456");
45-
// 执行认证提交
46-
subject.login(token);
47-
// 是否认证通过
48-
boolean isAuthenticated = subject.isAuthenticated();
49-
System.out.println("是否认证通过:" + isAuthenticated);
50-
// 退出操作
51-
subject.logout();
52-
System.out.println("登陆已经注销");
53-
// 是否认证通过
54-
isAuthenticated = subject.isAuthenticated();
55-
System.out.println("是否认证通过:" + isAuthenticated);
56-
}
26+
// /**
27+
// * 用户登陆和退出
28+
// */
29+
// @Test
30+
// public void testLoginAndLogout() {
31+
// // 创建 securityManager 工厂,通过ini配置文件创建 securityManager 工厂
32+
// Factory<SecurityManager> factory = new IniSecurityManagerFactory(
33+
// "classpath:shiro.ini");
34+
// // 创建 SecurityManager
35+
// SecurityManager securityManager = factory.getInstance();
36+
// // 将 securityManager 设置当前的运行环境中
37+
// SecurityUtils.setSecurityManager(securityManager);
38+
// // 从SecurityUtils里边创建一个 subject
39+
// Subject subject = SecurityUtils.getSubject();
40+
// // 在认证提交前准备 token(令牌)
41+
// // 这里的账号和密码 将来是由用户输入进去
42+
// UsernamePasswordToken token = new UsernamePasswordToken("howie",
43+
// "123456");
44+
// // 执行认证提交
45+
// subject.login(token);
46+
// // 是否认证通过
47+
// boolean isAuthenticated = subject.isAuthenticated();
48+
// System.out.println("是否认证通过:" + isAuthenticated);
49+
// // 退出操作
50+
// subject.logout();
51+
// System.out.println("登陆已经注销");
52+
// // 是否认证通过
53+
// isAuthenticated = subject.isAuthenticated();
54+
// System.out.println("是否认证通过:" + isAuthenticated);
55+
// }
5756
}

0 commit comments

Comments
 (0)