• 数据库设计

  • pom.xml
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.shyroke</groupId>
  5. <artifactId>shiro_web</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>shiro_web Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <dependencies>
  11.  
  12. <dependency>
  13. <groupId>javax.servlet.jsp.jstl</groupId>
  14. <artifactId>jstl</artifactId>
  15. <version>1.2</version>
  16. </dependency>
  17.  
  18. <dependency>
  19. <groupId>javax.servlet.jsp</groupId>
  20. <artifactId>javax.servlet.jsp-api</artifactId>
  21. <version>2.3.1</version>
  22. <scope>provided</scope>
  23. </dependency>
  24.  
  25. <dependency>
  26. <groupId>org.apache.tomcat</groupId>
  27. <artifactId>servlet-api</artifactId>
  28. <version>6.0.53</version>
  29. </dependency>
  30.  
  31. <dependency>
  32. <groupId>org.apache.shiro</groupId>
  33. <artifactId>shiro-core</artifactId>
  34. <version>1.4.0</version>
  35. </dependency>
  36.  
  37. <dependency>
  38. <groupId>org.apache.shiro</groupId>
  39. <artifactId>shiro-web</artifactId>
  40. <version>1.4.0</version>
  41. </dependency>
  42.  
  43. <dependency>
  44. <groupId>org.slf4j</groupId>
  45. <artifactId>slf4j-log4j12</artifactId>
  46. <version>1.7.25</version>
  47. <scope>test</scope>
  48. </dependency>
  49.  
  50. <dependency>
  51. <groupId>commons-logging</groupId>
  52. <artifactId>commons-logging</artifactId>
  53. <version>1.2</version>
  54. </dependency>
  55.  
  56. <dependency>
  57. <groupId>log4j</groupId>
  58. <artifactId>log4j</artifactId>
  59. <version>1.2.17</version>
  60. </dependency>
  61.  
  62. <dependency>
  63. <groupId>c3p0</groupId>
  64. <artifactId>c3p0</artifactId>
  65. <version>0.9.1.2</version>
  66. </dependency>
  67.  
  68. <dependency>
  69. <groupId>mysql</groupId>
  70. <artifactId>mysql-connector-java</artifactId>
  71. <version>6.0.6</version>
  72. </dependency>
  73.  
  74. </dependencies>
  75. <build>
  76. <finalName>shiro_web</finalName>
  77.  
  78. <plugins>
  79.  
  80. <plugin>
  81. <groupId>org.mortbay.jetty</groupId>
  82. <artifactId>maven-jetty-plugin</artifactId>
  83. <version>6.1.26</version>
  84. <configuration>
  85. <!-- 每2秒的间隔扫描一次,实现热部署 -->
  86. <scanIntervalSeconds>2</scanIntervalSeconds>
               <!-- 设置为手动部署,即在Console中回车即部署 -->
  87. <reload>manual</reload>
  88. <contextPath>/</contextPath>
  89. <connectors>
  90. <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
  91. <port>3033</port>
  92. </connector>
  93. </connectors>
  94. </configuration>
  95.  
  96. </plugin>
  97. </plugins>
  98.  
  99. </build>
  100. </project>
  • shiro.ini
  1. [main]
  2. authc.loginUrl= /login
  3. roles.unauthorizedUrl= /unauthorized.jsp
  4. perms.unauthorizedUrl= /unauthorized.jsp
  5. myRealm=com.shyroke.realms.MyRealm
  6. securityManager.realms=$myRealm
  7.  
  8. [urls]
  9. /index.jsp = authc
  10. / = authc
  11. /admin.jsp = authc,perms[admin:query]
  12. /jsp/user.jsp = authc,perms[user:*]
  13. /jsp/user_add.jsp = authc,perms[user:add]
  14. /login = anon
  15. /logout = logout
    1. myRealm=com.shyroke.realms.MyRealm 表示创建com.shyroke.realms.MyRealm对象,对象名为myRealm
  • login.jsp
  1. <body>
  2. <form action="<%=path%>/login" method="post">
  3. userName:<input type="text" name="username" /><br /> passWord:<input
  4. type="password" name="password" /><br /> <input type="submit"
  5. value="登录">
  6. ${requestScope.emsg}
  7. </form>
  8. </body>
  • LoginServlet.java(url-pattern=" /login ")
  1. public class LoginServlet extends HttpServlet {
  2.  
  3. /**
  4. *
  5. */
  6. private static final long serialVersionUID = 1L;
  7.  
  8. @Override
  9. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  10. throws ServletException, IOException {
  11.  
  12. /**
  13. * 如果用户没有登录就即没有在index.jsp页面登录就会跳转到这个方法
  14. */
  15. request.getRequestDispatcher("/login.jsp").forward(request, response);
  16.  
  17. }
  18.  
  19. @Override
  20. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  21. throws ServletException, IOException {
  22.  
  23. request.setCharacterEncoding("UTF-8");
  24.  
  25. String userName = request.getParameter("username");
  26. String passWord = request.getParameter("password");
  27. String emsg = null;
  28.  
  29. Subject subject = SecurityUtils.getSubject();
  30.  
  31. UsernamePasswordToken token = new UsernamePasswordToken(userName, passWord);
  32.  
  33. try {
  34. subject.login(token);
  35. } catch (UnknownAccountException e) {
  36. emsg = "用户名错误";
  37. } catch (IncorrectCredentialsException e) {
  38. emsg = "密码错误";
  39. }
  40.  
  41. if (emsg != null) {
  42. // 说明认证错误
  43. request.setAttribute("emsg", emsg);
  44. request.getRequestDispatcher("/login.jsp").forward(request, response);
  45. } else {
  46. request.getRequestDispatcher("/index.jsp").forward(request, response);
  47. }
  48. }
  49. }
  • MyRealm.java
  1. public class MyRealm extends AuthorizingRealm {
  2.  
  3. UserDao userDao = new UserDao();
  4.  
  5. /**
  6. * 为当前登录的用户授予角色和权限
  7. */
  8. @Override
  9. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  10.  
  11. String userName=principals.getPrimaryPrincipal().toString();
  12.  
  13. /**
  14. * 根据用户名获取当前用户的角色和权限集合
  15. */
  16.  
  17. Set<String> roles=userDao.getRolesByName(userName);
  18. Set<String> objectPermissions=userDao.getPermissionsByName(userName);
  19.  
  20. /**
  21. * 为该用户设置角色和权限
  22. */
  23. SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
  24.  
  25. authorizationInfo.addRoles(roles);
  26.  
  27. authorizationInfo.setStringPermissions(objectPermissions);
  28.  
  29. return authorizationInfo;
  30. }
  31.  
  32. /**
  33. * 验证当前登录的用户
  34. */
  35. @Override
  36. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  37. String userName = token.getPrincipal().toString();
  38.  
  39. User user = userDao.getUserByName(userName);
  40.  
  41. if (user != null) {
  42. /*
  43. * 说明用户登录成功
  44. */
  45. AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUserName(), user.getPassWord(),
  46. getName());
  47. return authenticationInfo;
  48. }
  49.  
  50. return null;
  51. }
  52.  
  53. }
  • UserDao.java
  1. package com.shyroke.dao;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.util.HashSet;
  7. import java.util.Set;
  8.  
  9. import com.shyroke.entity.User;
  10. import com.shyroke.util.DBUtil;
  11.  
  12. public class UserDao {
  13.  
  14. /**
  15. * 根据用户名查询用户
  16. *
  17. * @param userName
  18. * @return User
  19. */
  20. public User getUserByName(String userName) {
  21. User user = null;
  22. Connection conn = null;
  23. PreparedStatement ps = null;
  24. String sql = "";
  25. ResultSet rs = null;
  26. try {
  27. sql = "select * from user where user_name='" + userName + "'";
  28. conn = DBUtil.getConn();
  29. ps = conn.prepareStatement(sql);
  30. rs = ps.executeQuery();
  31.  
  32. if (rs.next()) {
  33. user=new User();
  34. user.setId(rs.getInt("user_id"));
  35. user.setUserName(rs.getString("user_name"));
  36. user.setPassWord(rs.getString("user_password"));
  37. }
  38.  
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. } finally {
  42. try {
  43. DBUtil.close(conn, ps, rs);
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }
  48.  
  49. return user;
  50. }
  51.  
  52. public Set<String> getRolesByName(String userName) {
  53. Set<String> roles = new HashSet<String>();
  54.  
  55. Connection conn = null;
  56. PreparedStatement ps = null;
  57. StringBuffer sb = new StringBuffer();
  58. ResultSet rs = null;
  59. try {
  60. sb.append("select role_name from role where role_id in");
  61. sb.append("(");
  62. sb.append("select role_id from user_role where user_id in(");
  63. sb.append("select user_id from user where user_name='" + userName + "')");
  64. sb.append(")");
  65. conn = DBUtil.getConn();
  66. ps = conn.prepareStatement(sb.toString());
  67. rs = ps.executeQuery();
  68.  
  69. while (rs.next()) {
  70. roles.add(rs.getString("role_name"));
  71. }
  72.  
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. } finally {
  76. try {
  77. DBUtil.close(conn, ps, rs);
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. }
  81. }
  82.  
  83. return roles;
  84. }
  85.  
  86. public Set<String> getPermissionsByName(String userName) {
  87. Set<String> perms = new HashSet<String>();
  88.  
  89. Connection conn = null;
  90. PreparedStatement ps = null;
  91. StringBuffer sb = new StringBuffer();
  92. ResultSet rs = null;
  93. try {
  94. sb.append("select permission_name from permission where permission_id in(");
  95. sb.append("select permission_id from permission_role where role_id in");
  96. sb.append("(");
  97. sb.append("select role_id from user_role where user_id in");
  98. sb.append(" (");
  99. sb.append(" select user_id from user where user_name='"+userName+"'");
  100. sb.append(" )");
  101. sb.append(" )");
  102. sb.append(" )");
  103. conn = DBUtil.getConn();
  104. ps = conn.prepareStatement(sb.toString());
  105. rs = ps.executeQuery();
  106.  
  107. while (rs.next()) {
  108. perms.add(rs.getString("permission_name"));
  109. }
  110.  
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. } finally {
  114. try {
  115. DBUtil.close(conn, ps, rs);
  116. } catch (Exception e) {
  117. e.printStackTrace();
  118. }
  119. }
  120.  
  121. return perms;
  122. }
  123.  
  124. }
  • user.java
  1. public class User {
  2. private Integer id;
  3. private String userName;
  4. private String passWord;
  5. //省略getset方法
  6. }
  • DBUtil.java
  1. public class DBUtil {
  2. private static final String DRIVER = "com.mysql.jdbc.Driver";
  3. private static final String USER = "root";
  4. private static final String PASSWD = "";
  5. private static final String URL = "jdbc:mysql://127.0.0.1:3306/shiro?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
  6. private static ComboPooledDataSource dataSource = null;
  7. static {
  8. try {
  9. Class.forName(DRIVER);
  10.  
  11. Context context = new InitialContext();
  12.  
  13. dataSource = new ComboPooledDataSource();
  14. dataSource.setMaxPoolSize(50);
  15. dataSource.setInitialPoolSize(20);
  16. dataSource.setJdbcUrl(URL);
  17. dataSource.setDriverClass(DRIVER);
  18. dataSource.setUser(USER);
  19. dataSource.setPassword(PASSWD);
  20.  
  21. } catch (Exception e) {
  22.  
  23. throw new RuntimeException("驱动包加载故障");
  24. }
  25.  
  26. }
  27.  
  28. public static Connection getConn() {
  29. Connection conn = null;
  30. try {
  31. conn = dataSource.getConnection();
  32. } catch (SQLException e) {
  33. e.printStackTrace();
  34. }
  35.  
  36. return conn;
  37. }
  38.  
  39. public static void close(Connection con,PreparedStatement ps,ResultSet rs)throws Exception{
  40. if(con!=null){
  41. con.close();
  42. }
  43. if(ps!=null){
  44. ps.close();
  45. }
  46. if(rs!=null){
  47. rs.close();
  48. }
  49. }
  50.  
  51. public static void main(String[] args) {
  52. for (int i = 0; i < 100; i++) {
  53.  
  54. System.out.println(DBUtil.getConn() + "\t " + i);
  55. }
  56. }
  57. }
  • 目录结构

  • 结果:

(十)shiro之自定义Realm以及自定义Realm在web的应用demo的更多相关文章

  1. Apache Shiro 使用手册(四)Realm 实现

    在认证.授权内部实现机制中都有提到,最终处理都将交给Real进行处理.因为在Shiro中,最终是通过Realm来获取应用程序中的用户.角色及权限信息的.通常情况下,在Realm中会直接从我们的数据源中 ...

  2. shiro多realm验证之——shiro实现不同身份使用不同Realm进行验证(转)

    转自: http://blog.csdn.net/xiangwanpeng/article/details/54802509 (使用特定的realm实现特定的验证) 假设现在有这样一种需求:存在两张表 ...

  3. Apache Shiro 使用手册(四)Realm 实现(转发:http://kdboy.iteye.com/blog/1169631)

    在认证.授权内部实现机制中都有提到,最终处理都将交给Real进行处理.因为在Shiro中,最终是通过Realm来获取应用程序中的用户.角色及权限信息的.通常情况下,在Realm中会直接从我们的数据源中 ...

  4. shiro实现不同身份使用不同Realm进行验证

    转载:https://blog.csdn.net/xiangwanpeng/article/details/54802509 假设现在有这样一种需求:存在两张表user和admin,分别记录普通用户和 ...

  5. 30、shiro框架入门2,关于Realm

    1.Jdbc的Realm链接,并且获取权限 首先创建shiro-jdbc.ini的配置文件,主要配置链接数据库的信息 配置文件中的内容如下所示 1.变量名=全限定类名会自动创建一个类实例 2.变量名. ...

  6. Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)

    Dialog详解(包括进度条.PopupWindow.自定义view.自定义样式的对话框)   Android中提供了多种对话框,在实际应用中我们可能会需要修改这些已有的对话框.本实例就是从实际出发, ...

  7. asp.net MVC 自定义@helper 和自定义函数@functions小结

    asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...

  8. activiti自定义流程之自定义表单(三):表单列表及预览和删除

    注:(1)环境配置:activiti自定义流程之自定义表单(一):环境配置 (2)创建表单:activiti自定义流程之自定义表单(二):创建表单 自定义表单创建成功,要拿到activiti中使用,自 ...

  9. activiti自定义流程之自定义表单(二):创建表单

    注:环境配置:activiti自定义流程之自定义表单(一):环境配置 在上一节自定义表单环境搭建好以后,我就正式开始尝试自己创建表单,在后台的处理就比较常规,主要是针对ueditor插件的功能在前端进 ...

  10. MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

    实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器 MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过A ...

随机推荐

  1. Java 内存模型学习笔记

    1.Java类 public class Math { public static final Integer CONSTANT = 666; public int math(){ int a = 1 ...

  2. Linux中split大文件分割和cat合并文件

    当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输.这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件. 1.分割 ...

  3. 设计-Int(4)和Int(11)谁更美

    设计-Int(4)和Int(11)谁更美 [缘起] 大家平时在进行数据库设计的时候,如果遇到需要存储整数类型的数据的时候,通常会优先使用Int这个整数类型,在处理20亿级别的正负数值存储上,Int类型 ...

  4. SpringCloud学习成长之路三 服务消费者(Feign)

    一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解. 它具有可插拔的注解特性,可使用Feign 注解和JAX-RS ...

  5. Go项目部署到服务器

    -bash: ./main: cannot execute binary file 将 go build main.go 生成的文件上传到服务器后,./main 运行后出新的报错 env GOOS=l ...

  6. Java测试当前应用所占用的内存示例

    package test; import java.util.HashMap; import java.util.Map; public class TestMemory { public stati ...

  7. Caché到MySQL数据同步方法!

    随着医疗行业信息化的发展,积累了大量的业务数据,如何挖掘这些数据,实现数据的可视化被提上日程,医院中通常有许多的信息化系统,使用的又都是不同厂商的数据库产品,如何统一汇聚数据,实现数据互通也是一个大问 ...

  8. golang web框架 beego 学习 (五) 配置文件

    app.conf: appname = gowebProject httpport = runmode = dev copyrequestbody = true [db] host= localhos ...

  9. CenOS 7 安装JDK

    1.输入安装命令 yum install java-1.8.0-openjdk-devel.x86_64

  10. 当后端返回的数据是以属性做开头,怎么用length取值

    在我们前端开发中,一般需要的数据是分条的如 [{},{},{},{}] ,这样的数据方便我们用length取值,尤其是在表格中.在控制台看的时候能轻易的看出1 2 3 4条,但有时候后台返回的数据不是 ...