Filtro do Grails para impor SSL (https) a determinadas páginas

Olá pessoal,


hoje andei pesquisando a respeito de uso de certificados SSL com uma aplicação grails. Afinal, está chegando a hora de impor o uso de SSL (https) meu novo site de controle financeiro, o Manubia.com.br .

Então ao pesquisar o assunto, encontrei uma classe de um grails Filter que pode me ajudar muito em forçar determinadas URLs a usarem SSL e outras não. Por exemplo, uma página que mostra dados não confidenciais, não precisa usar SSL (https). Já uma página que mostra ou recebe um formulário confidencial DEVE usar SSL.

Aí vai o Filter. Ainda não testei, mas parece certinho.

Abcs

/**
* Created by IntelliJ IDEA.
* User: danielhonig
* Date: Jan 23, 2009
* Time: 4:27:10 PM
* To change this template use File | Settings | File Templates.
*/

import org.codehaus.groovy.grails.commons.ConfigurationHolder

class SSLFilters {
// Set these to your HTTP/HTTPS ports
def defaultPortHTTP = 80
def defaultPortHTTPS = 443

static def SSLRequiredMap = ConfigurationHolder.config.SSLRequiredMap

def shouldUseSSL(controllerName, actionName) {
// User actions use SSL
if (SSLRequiredMap[controllerName]!=null) {

//If * then all actions are secured
if (SSLRequiredMap[controllerName][0] == '*')
return true

//else look for specific action
if (SSLRequiredMap[controllerName].contains(actionName))
return true
}
false
}

def filters = {
sslFilter(controller: "*", action: "*"){
before = {
def controller = controllerName
def action = actionName
log.debug("SSLFilter: ${params?.controller}.${params?.action}")
def url = null

// SSL off by default
def useSSL = shouldUseSSL(controllerName,actionName)

log.debug("${controller}.${action}, useSSL:$useSSL")

// Get redirected url
url = getRedirectURL(request, params, useSSL);

// If redirect url returned, redirect to it
if (url) {
redirect(url: url)
return false;
}

return true;
}
}
}

def getRedirectURL = {request, params, ssl ->
log.debug("getRedirectURL: $ssl")

// Are we there already?
if (request.isSecure() == ssl)
return null;

def protocol
def port

// Otherwise we need to flip
if (ssl) {
protocol = 'https'

// If using the standard ports, don't include them on the URL
port = defaultPortHTTPS
if (port == "443")
port = ""
else
port = ":${port}"
}
else {
protocol = 'http'
// If using the standard ports, don't include them on the URL
port = defaultPortHTTP
if (port == "80")
port = ""
else
port = ":${port}"
}

log.debug("Flip protocol to $protocol")

def url = request.forwardURI
def server = request.serverName
def args = paramsAsUrl(params)
url = "$protocol://$server$port$url$args"

log.debug("getRedirectURL - redirect to $url")

return url;
}

def paramsAsUrl = {params ->
int ii = 0
String args = ""
params.each
{k, v ->
if (['controller', 'action', 'id'].find {k == it})
return;

if (ii)
args += "&"
else
args += "?"

args += "$k=$v"
ii++
}

return args

}
}