shiro-web-01

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro-web-01相关的知识,希望对你有一定的参考价值。

MyRealm.java

package cn.mldn.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.SimpleAccount;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

import cn.mldn.service.MemberLoginService;
import cn.mldn.vo.Member;

public class MyRealm extends AuthorizingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("*********** 1、用户登录认证操作的处理   doGetAuthenticationInfo ***********");
        // 登录认证的方法先执行,需要用它来判断登录的用户信息是否合法
        String username = (String) token.getPrincipal() ; // 取得用户名
        MemberLoginService service = new MemberLoginService() ;
        Member vo = service.get(username) ; // 取得的是用户的信息
        service.close();
        if (vo == null) {
            throw new UnknownAccountException("该用户不存在!");
        }
        else {  //进心密码验证处理
            String password = new String((char []) token.getCredentials());
            // 将数据库中的密码与输入的密码进行比较,这样就可以确定当前用户是否可以正常的登录了。
            if(vo.getPassword().equals(password)) {
                AuthenticationInfo auth = new SimpleAuthenticationInfo(username,password,"memberRealm");
                return auth ;
            }
            else {
                throw new IncorrectCredentialsException("密码错误");
            }
        }
    }
    
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("*********** 2、用户角色与权限 doGetAuthorizationInfo  ***********");
        String username = (String) principals.getPrimaryPrincipal() ; // 取得用户名
        SimpleAuthorizationInfo auth = new SimpleAuthorizationInfo() ; // 定义授权信息的返回处理
        MemberLoginService service = new MemberLoginService() ;
        auth.setRoles(service.listRolesByMember(username)); // 所有的角色必须以set集合出现
        auth.setStringPermissions(service.listActionsByMember(username));
        service.close();
        
        
        return null;
    }
    
}

MemberLoginService.java

package cn.mldn.service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

import org.gjt.mm.mysql.Driver;

import cn.mldn.vo.Member;

public class MemberLoginService {
    private Connection conn ;
    
    private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    private static final String DBURL  =   "jdbc:mysql://192.168.43.3:3306/shirodb" ;
    private static final String DBUSER = "root" ;
    private static final String PASSWORD = "mysqladmin" ;
    private PreparedStatement pstmt = null ;
    public MemberLoginService () {
        this.connectDataBase();
    }
    
    public Member get (String username) {
        Member vo = null ;
        try {

            String sql = "SELECT mid , password FROM member WHERE mid=?" ;
            this.pstmt = this.conn.prepareStatement(sql);
            this.pstmt.setString(1, username);
            ResultSet rs = this.pstmt.executeQuery(); 
            
            if (rs.next()) {
                vo = new Member() ;
                vo.setMid(rs.getString(1));
                vo.setPassword(rs.getString(2));
            }
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return vo ;
    }
    
    /**
     *  SELECT flag FROM role WHERE rid IN (
     *      SELECT rid FROM member_role WHERE mid=? )
     */
    public Set<String> listRolesByMember(String mid) {
        Set<String> allRoles = new HashSet<String>() ;
        String sql = " SELECT flag FROM role WHERE rid IN ( SELECT rid FROM member_role WHERE mid=? )" ;
        
        try {
            this.pstmt = this.conn.prepareStatement(sql) ;
            this.pstmt.setString(1, mid);
            ResultSet rs = this.pstmt.executeQuery() ;
            while(rs.next()){
                allRoles.add(rs.getString(1)) ;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return allRoles;
    }
    
    /**
     * 
     * @param mid
     * @return
     */
    public Set<String> listActionsByMember(String mid) {
        Set<String> allActions = new HashSet<String>() ;
        String sql = " SELECT flag FROM action WHERE actid IN ( SELECT actid FROM role_action WHERE rid in ("
                + "SELECT rid FROM member_role WHERE mid=?"
                + ") )" ;
        
        try {
            this.pstmt = this.conn.prepareStatement(sql) ;
            this.pstmt.setString(1, mid);
            ResultSet rs = this.pstmt.executeQuery() ;
            while(rs.next()){
                allActions.add(rs.getString(1)) ;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return allActions;
    }
    
    
    public void close() {
        if(this.conn != null){
            try {
                this.conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    private void connectDataBase(){
        try {
            Class.forName(DBDRIVER);
            this.conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD);
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 }

Member.java

package cn.mldn.vo;

import java.io.Serializable;

public class Member implements Serializable {
    private String mid ;
    private String name ;
    private String password ;
    public String getMid() {
        return mid;
    }
    public void setMid(String mid) {
        this.mid = mid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}

LoginServlet.java

package cn.mldn.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;

@SuppressWarnings("serial")
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String mid = request.getParameter("mid") ;
        String password = request.getParameter("password") ;
        Subject subject = SecurityUtils.getSubject() ;
        UsernamePasswordToken token = new UsernamePasswordToken(mid, password) ;
        subject.login(token);
        request.getRequestDispatcher("/pages/welcome.jsp").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

shiro.ini     shiro 过滤检测 anon authc authcBasic perms port rest roles ssl user

[main]
# 如果现在认证失败,则跳转到loginUrl配置路径
authc.loginUrl=/login.jsp
jdbcRealm=cn.mldn.realm.MyRealm
securityManager.realms=$jdbcRealm

[urls]
# 登陆页面不需要进行检测处理的
/shiroLogin=anon
# 指定的页面需要进行登录检测的
/pages/welcome.jsp=authc

web.xml    配置监听器参考路径 : http://shiro.apache.org/webapp-tutorial.html

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>shirodemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <listener>
    <listener-class>
            org.apache.shiro.web.env.EnvironmentLoaderListener
        </listener-class>
  </listener>
  <filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    <init-param>
      <param-name>configPath</param-name>
      <param-value>classpath:shiro.ini</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>
</web-app>

login.jsp

<%@ page language="java"  pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath() ;
    String basePath = request.getScheme() + "://" +request.getServerName() 
    + ":" +request.getServerPort() + path + "/" ;
%>
<html>
<head>
<base href="<%=basePath%>">
<title>Shiro Login Demo</title>
</head>
<body>
    <form action="LoginServlet" method="post">
        用户名: <input type="text" name="mid" id="mid" >  <br>
        密码:    <input type="password" name="password" id="password" >  <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

welcome.jsp

<%@ page language="java"  pageEncoding="UTF-8"%>
<html>
<head>

<title>Insert title here</title>
</head>
<body>
    <h1>Welcome !</h1>
</body>
</html>

 

以上是关于shiro-web-01的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数